Добавить аргументы в 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 – сигнализирует о конце опций и отключает дальнейшую обработку опций. Любые аргументы после – рассматриваются как имена файлов и аргументы.

  • Как использовать переменную оболочки внутри команды sed?
  • Как работает опция -d для чтения bash?
  • bash добавить значение к массиву со встроенной переменной и одинарные кавычки
  • Петля над строкой в ​​zsh и Bash
  • Как положить $ @ в кавычки?
  • переменная echo с содержимым из подстановки команды
  • grep неправильно читает шаблон из переменной
  • Выражение фильтра tcpdump прерывается через adb
  • 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

    Предупреждать о несуществующих псевдонимах в mutt

    Нет locate.db даже после запуска updatedb

    Экран отключается через 10 минут, и я не могу понять, почему

    Настройка iptables по программному обеспечению

    Не удается запустить mysqld (mariadb) в Fedora, если поместить резервную копию в / var / lib / mysql

    Arch Linux загружается до tty1 по умолчанию вместо tty7 после обновления

    Как заменить один цветовой код на другой в терминале?

    Выполнение команд с помощью сценария ssh и оболочки с использованием переменных на удаленной машине

    Проблема с попыткой фильтрации файла dat или csv на основе значений первого столбца с помощью awk?

    Атака грубой силы на сервере vsftp не показывает неудачную проверку подлинности в журнале

    листинг

    Debian / Ubuntu: как скомпилировать ядро ​​Linux на одной машине и использовать на других машинах (той же архитектуре)

    Как использовать порты USB на мониторе для звука

    Найти родителя процесса

    Почему исполняемые файлы, например, / usr / sbin доступны для записи root?

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