Щоб зберегти вихід команди як змінну в sh / ksh / bash, ви можете зробити будь-яке
var=$(command)
або
var=`command`
Яка різниця, якщо така є між двома методами?
Щоб зберегти вихід команди як змінну в sh / ksh / bash, ви можете зробити будь-яке
var=$(command)
або
var=`command`
Яка різниця, якщо така є між двома методами?
Відповіді:
Повернення / могили застаріли на користь $()
заміни команд, тому що $()
вони легко гніздяться всередині себе як у $(echo foo$(echo bar))
. Існують і інші відмінності, такі як те, що підсумовуються кососуші риси у версії backtick / gravmark тощо.
Дивіться BashFAQ / 082 з кількох причин, щоб завжди віддати перевагу синтаксису $ (...).
Також дивіться специфікацію POSIX для отримання детальної інформації про різні відмінності.
$(...)
- він просто відзначає їх в якості альтернативи.
"the backquoted variety of command substitution is not recommended"
що це лише давно звивистий спосіб сказати застаріле IMHO
$(...)
як альтернативний метод. Невідома помилка реалізації із задніми посиланнями, але існує багато відомих помилок реалізації $(...)
. Тому для проблем з переносністю рекомендується використовувати зворотні посилання для невкладених дзвінків. $(...)
потрібен рекурсивний аналізатор, але це не було використано для ksh86, який запровадив цю функцію. Перевірте в in-ulm.de/~mascheck/various/cmd-subst список правильних реалізацій. Відповідна оболонка повинна підтримувати всі випадки, крім випадку D.2.
deprecated
, наприклад, використання waitpid()
цього заважає бачити цілі 32 біти від exit()
параметра, але всі оболонки, окрім недавнього Bourne Shell, все ще використовують waitpid()
замість waitid()
виклику, який тепер доступний з 26 років.
$()
, що детальніше пояснено в цій частині документації . Відмінності полягають не лише в гніздування.
Вони поводяться так само. Різниця синтаксична: гніздо легше, $()
ніж ``
:
listing=$(ls -l $(cat filenames.txt))
vs.
listing=`ls -l \`cat filenames.txt\``
echo $(echo \$abc)
не те саме, що echo `echo \$abc`
- Відмінності існують $(echo \`)
і для$(echo \\)
echo foo `#comment`
проти echo foo $(#comment)
. Другий не працює. (Використовується для коментування в багаторядковій команді.)
Липень 2014 року: команда f25f5e6 (автор: Elia Pinto ( devzero2000
) , квітень 2014 року, Git 2.0) додає до вкладеного питання:
Форма, що котирується назад, є традиційним методом заміни команд і підтримується POSIX.
Однак усі, крім найпростіших видів використання, ускладнюються швидко.
Зокрема, вбудовані підстановки команд та / або використання подвійних лапок вимагають ретельного виходу із символом зворотної косої риски .
Ось чому згадується git / Documentation / CodingGuidelines :
Ми віддаємо перевагу
$( ... )
заміні команд; на відміну від ``, він належним чином гніздиться .
Це повинно було бути так, як Борн написав це з першого дня, але, на жаль, це не так.
Ось чому
`echo `foo``
не працюватиме взагалі через притаманну неоднозначність, оскільки кожен``
може відкриватися чи закриватися.
Це може спрацювати в особливих випадках через удачу або особливі особливості.
Оновлення січня 2016 року: Git 2.8 (березень 2016 р.) Повністю позбавляється від підстав.
Див здійснювати ec1b763 , здійснювати 9c10377 , здійснюють c7b793a , здійснюють 80a6b3f , здійснюють 9375dcf , здійснюють e74ef60 , здійснюють 27fe43e , здійснюють 2525c51 , здійснюють becd67f , здійснюють a5c98ac , здійснюють 8c311f9 , здійснюють 57da049 , здійснюють 1d9e86f , здійснюють 78ba28d , здійснюють efa639f , здійснюють 1be2fa0 , зробити 38e9476 , здійснити 8823d2f , зробити 32858a0 , зробити cd914d8(12 січня 2016) Еліа Пінто ( devzero2000
) .
(Об’єднав Хуніо С Хамано - gitster
- в комісії e572fef , 22 січня 2016 р.)
Від Git 2.8 далі, це все $(...)
, не більше `...`
.
$()
також вказано POSIX - цитата, яка описує задні позиції як "підтримувані POSIX" таким чином, щоб зрозуміти, що це унікальне для них є оманливим. Це єдиний (епоха 1970-х років) пре-POSIX-Борн, де задні посилання є єдиним підтримуваним синтаксисом.
Коли використовується більш стара форма зворотного галочки, зворотна косою рисою зберігається буквальне значення, за винятком випадків, коли слідує $, `або \. Перша галочка, що не передує зворотній косої риси, завершує заміну команди.
При використанні нової $(command)
форми всі символи між дужками складають команду; ніхто не лікується спеціально.
Обидві форми можуть бути вкладені, але для зворотного галочки потрібна наступна форма.
`echo \`foo\``
На відміну від:
$(echo $(foo))
$()
версії сумісні з POSIX.
Різниця невелика, за винятком того, які символи без нагляду можна використовувати всередині команди. Ви навіть можете помістити команди `...` всередині $ (...) (і навпаки) для більш складної заміни двох рівнів.
Існує дещо інша інтерпретація символу / оператора зворотної косої риски. Серед іншого, коли вкладеності `...` команди заміни, ви повинні екранувати внутрішні ` символи з \, в той час як з $ () substition він розуміє вкладеності автоматично.