Для підстановки команд є два синтаксиси: з дужками в доларах і з зворотними посиланнями. Запуск top -p $(pidof init)
і top -p `pidof init`
дає однаковий вихід. Це два способи зробити одне і те ж чи є відмінності?
Для підстановки команд є два синтаксиси: з дужками в доларах і з зворотними посиланнями. Запуск top -p $(pidof init)
і top -p `pidof init`
дає однаковий вихід. Це два способи зробити одне і те ж чи є відмінності?
Відповіді:
Зворотні котирування в старому стилі ` `
обробляють зворотні коси та гніздування дещо інакше. Новий стиль $()
інтерпретує все між собою ( )
як команду.
echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
працює, якщо вкладені зворотні котирування не виконуються:
echo `uname | \`echo cat\``
Linux
весело зворотній косою рисою:
echo $(echo '\\')
\\
echo `echo '\\'`
\
Новий стиль $()
застосовується до всіх оболонок, що відповідають POSIX .
Як зазначав Мувічієль , ` `
для старих мушлі може знадобитися старий стиль .
Крім технічної точки зору, старий стиль ` `
має і візуальний недолік:
I like $(program) better than `program`
'`'`''`''`'`''`'
(і SE використовує ` `
для власних цілей, боляче писав цю відповідь :)
{ }
зазвичай називається "фігурними дужками" або "дужками" en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
це мертвий ключ, тому мені доводиться вводити або подвійний зворотній зв'язок (щось, про що я зазвичай забуваю, я навіть можу зробити), або зворотній вибір, а потім пробіл, який є біль.
Очевидна відмінність, яку я зауважую, полягає в тому, що ви не можете гніздити задники, поки ви можете гніздо $()
. Можливо, обидва існують із спадкових причин. Аналогічно, команди .
і source
команди є синонімами.
source
. Тире - один із прикладів.
$(...)
і `...`
стандартне (останнє застаріле), а .
стандартне, але неsource
(t)csh
вони не можуть бути вкладені. (t)csh
не підтримую, $(...)
хоча. Вони все ж підтримують source
(і ні .
).
Ще одна примітка, $()
буде використовувати більше системного ресурсу, ніж використання зворотних посилань, але трохи швидше.
Під час засвоєння сценаріїв оболонки Unix Рандал К. Майкл провів тест у главі під назвою "24 способи обробки файлу по черзі".
$()
робить ваш скрипт на один байт більшим, ніж якщо б він не використовувався `
(припускаючи, що ви не вкладаєте їх і не використовуєте звороту косу рису в межах). Щодо того, що було б швидше проаналізувати, це буде різнитися між оболонками і було б несуттєвим, як мізерним порівняно з витратами на створення труби та роздрібнення процесу, що передбачає заміну команд.
Щоб додати те, що тут сказали інші, ви можете використовувати зворотні посилання для імітації вбудованих коментарів:
echo foo `# I'm a comment!` bar
Вихід: foo bar
.
Для отримання додаткової інформації див. Наступне: https://stackoverflow.com/a/12797512 (Зверніть увагу також на коментарі нижче до цієї публікації.)
$()
Синтаксис не працюватиме зі старою оболонкою Борна.
З більш новими оболонками ` `
і $()
вони рівноцінні, але $()
їх набагато зручніше використовувати, коли потрібно вкладати кілька команд.
Наприклад :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
простіше набрати та налагодити, ніж:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``