Добавить аргументы в bash -c

Скажем, что я хочу запустить команду через bash следующим образом:

/bin/bash -c "ls -l" 

Согласно странице man bash, я мог бы также запустить ее следующим образом:

 # don't process arguments after this one # | pass all unprocessed arguments to command # | | # VV /bin/bash -c ls -- -l 

за исключением того, что он не работает (кажется, игнорируется). Я что-то делаю неправильно, или я неправильно интерпретирую страницу руководства?

Соответствующие цитаты от человека:

Если присутствует опция -c, команды считываются из строки. Если после строки есть аргументы, они назначаются позиционным параметрам, начиная с $ 0.

а также

A – сигнализирует о конце опций и отключает дальнейшую обработку опций. Любые аргументы после – рассматриваются как имена файлов и аргументы.

  • Как я могу избежать восклицательного знака в переменной среды PS1?
  • Как избежать одиночных или двойных кавычек при передаче переменной в bash-скрипт?
  • ssh пропускает несколько значений
  • Может видеть файл в / usr / local / bin с ls, но попытка его запуска дает файл не найден?
  • Использование sed для замены строки специальными символами другой строкой со специальными символами
  • Выражение фильтра tcpdump прерывается через adb
  • bash добавить значение к массиву со встроенной переменной и одинарные кавычки
  • Bash: командная строка с необязательными аргументами
  • 2 Solutions collect form web for “Добавить аргументы в bash -c”

    Вы неправильно интерпретируете страницу руководства. Во-первых, часть о -- сигнализация конца вариантов не имеет отношения к тому, что вы пытаетесь сделать. Параметр -c переопределяет остальную часть командной строки с этой точки, так что он больше не выполняет обработку параметров bash вообще, а это означает, что -- будет передан команде, а не обработан bash как конец опций маркер.

    Вторая ошибка заключается в том, что дополнительные аргументы назначаются как позиционные параметры для запуска процесса оболочки, а не как аргументы команды. Итак, то, что вы пытаетесь сделать, может быть сделано как одно из:

     /bin/bash -c 'echo "$0" "$1"' foo bar /bin/bash -c 'echo "$@"' bash foo bar 

    В первом случае, передавая эхо параметры $0 и $1 явно, а во втором случае, используя "$@" расширяться так же нормально, как «все позиционные параметры, кроме $ 0». Обратите внимание, что в этом случае нам нужно передать что-то, что нужно использовать как $0 ; Я выбрал «bash», так как это то, что обычно будет $0 , но что-нибудь еще будет работать.

    Что касается причин, по которым это делается, вместо того, чтобы просто передавать какие-либо аргументы, которые вы передаете непосредственно команде, которую вы перечисляете: обратите внимание, что в документации указано, что «command_s_ читается из строки», множественное число. Другими словами, эта схема позволяет:

     /bin/bash -c 'mkdir "$1"; cd "$1"; touch "$2"' bash dir file 

    Но, обратите внимание, что лучший способ удовлетворить вашу первоначальную цель может состоять в том, чтобы использовать env а не bash :

     /usr/bin/env -- "ls" "-l" 

    Если вам не нужны какие-либо функции, предоставляемые оболочкой, нет никаких оснований для ее использования – использование env в этом случае будет быстрее, проще и менее типизировано. И вам не нужно думать так же сложно, чтобы убедиться, что он будет безопасно обрабатывать имена файлов, содержащие метасимволы или пробелы оболочки.

    Я не уверен, какова ваша цель, но если вы просто пытаетесь создать машину Rube Goldberg – «приспособление, изобретение, устройство или устройство, которые намеренно переработаны или преувеличены, чтобы выполнить очень простую задачу в очень сложная мода "- затем попробуйте

     sh -c 'ls $0' -l 

    или

     sh -c 'ls $1' supercalifragilisticexpialidocious -l 

    или даже

     sh -c 'ls -$0' l 

    Вы должны уметь понять, как они работают из ответа богигека.

    Interesting Posts

    выполнение 2 скриптов с подключением

    Не удается войти в систему на удаленном сервере с помощью проверки подлинности с открытым ключом

    Преобразование json-объекта сопоставления в управляемую строку csv с использованием сценария bash

    Как прокручивать мультитайл-выход при использовании фильтров командной строки?

    Проблема с сокращением Tmux

    Как уменьшить буфер записи Linux для съемных устройств?

    Разделение упорядоченного списка в подсписках

    Новый сигнал поступает, когда выполнение выполняется в обработчике сигналов, как решить, что является первым?

    Как изменить размер только пропущенных изображений?

    Установите стороннее программное обеспечение на Linux из источника

    Вызывает ли процесс, вызывающий убийцу-убийцу?

    Linux для отображения содержимого заданного байта файла байтом с символом и его числовым представлением, отображаемым для каждого байта

    Удаление каталога из PATH

    EXT3 файловая система pre дайджест материал

    Создайте образ ISO-образа DVD из каталога

    Linux и Unix - лучшая ОС в мире.