В чем преимущество использования bash -c перед строкой here?

11

Есть ли реальная польза от использования по bash -c 'some command'сравнению с использованиемbash <<< 'some command'

Кажется, они достигают того же эффекта.

yosefrow
источник
Привет @Patrick спасибо за уведомление. Я действительно не был уверен, где лучшее место для публикации. Так как, с одной стороны, это вопрос Linux, а с другой стороны, bash является своего рода языком сценариев, а у другого сайта больше посетителей. В таком случае, где будет более подходящее место для публикации?
yosefrow
4
@yosefrow: любой сайт был бы в порядке ИМХО; но кросспостинг неприятен (вы просите людей на обоих сайтах тратить время на ваш вопрос, не давая им пользы от ответов друг друга).
Руах
Будет ли уместным удалить сообщение с одного из сайтов?
yosefrow
2
Другое незначительное отличие состоит в том, что bash -c '...'будут работать в оболочках, которые не имеют этих строк Вы предполагаете, что bash будет вызываться в оболочке bash, но это не всегда так.
Джоэл Корнетт

Ответы:

21

bash -c 'some command'сохраняет доступ к стандартному вводу вызывающей стороны, поэтому readчтение команд из стандартного ввода будет работать нормально. bash <<< 'some command'заменяет этот ввод передаваемой строкой, bash -c catи bash <<< catделает разные вещи.

$ bash -c cat
abc
abc
^D
$ bash <<< cat
$

С другой стороны, вы можете использовать эту функцию, чтобы предоставить свой собственный стандартный ввод, который будет использоваться $'...', если вы очень осторожны:

$ bash <<< $'read x y\nabc def ghi\necho $y'
def ghi
$

Я бы не хотел на это полагаться, но иногда это было бы удобно.


bash -cтакже позволяет передавать аргументы в сценарий и $0устанавливать:

bash -c 'some command' sh abc def

будет установлен $1в abcи $2к defвнутренней some command.

Майкл Гомер
источник
3
Синтаксические ошибки также приведут к несколько иной формулировке. Главным образом те, bash -cкоторые упоминают -c, AFAIK. Не совсем бессмысленно, поскольку это может помочь отследить их. bash <<< 'script'ошибки выглядят так же, как ошибки в родительском скрипте; bash -c 'script'те не делают. Вы даже можете пометить их bash -c 'script' label.
Дероберт
Ну bash <<< 'echo $1' /dev/stdin fooтоже работает и печатает foo. Хотя настройка $0несколько более ограничена.
ilkkachu
bash <<< 'echo "$1"' /dev/stdin fooне всегда работает Я bash <<< 'echo "$1"' -s fooдолжен работать.
G-Man говорит: «Восстанови Монику»