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
.