Самое время решить эту головоломку, которая беспокоила меня годами ...
Я встречался с этим время от времени и думал, что это путь:
$(comm "$(arg)")
И думал, что мое мнение было решительно подтверждено опытом. Но я больше не уверен в этом. Shellcheck тоже не может определиться . Это оба:
"$(dirname $0)"/stop.bash
^-- SC2086: Double quote to prevent globbing and word splitting.
И:
$(dirname "$0")/stop.bash
^-- SC2046: Quote this to prevent word splitting.
Какая логика позади?
(Это версия Shellcheck 0.4.4, кстати.)
"$(dirname "$0")"/stop.bash
? Кажется, работает ... Что за история?
shell_level_1 $(shell_level_2) shell_level_1
: когда вы внутри, $(....)
вы вводите «подуровень» оболочки, НО вы можете писать в нем, как если бы вы были на начальном уровне (то есть вы можете писать напрямую "
вместо \"
и т. д.). Пример: touch "/tmp/a file" ; echo "its size is: $(find "/tmp/a file" -ls | awk '{print $5}) ..." : if you used backticks you'd have to
найти \ "/ tmp / файл \" `и print \$5
. Без $(...)
необходимости: оболочка адаптируется к новому уровню, и вы можете писать напрямую, как будто ваш переводчик теперь тоже на этом уровне.