Саме час вирішити цю загадку, яка мене турбує роками ...
Я час від часу зустрічався з цим і думав, що це шлях:
$(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, btw.)
"$(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
. З $(...)
немає необхідності: оболонка адаптується до нового рівня , і ви можете написати безпосередньо , як якщо ваш перекладач зараз на цьому рівні теж.