Он не устарел, но обратные кавычки ( `...`
) являются устаревшим синтаксисом, необходимым только для самых старых из не -POSIX-совместимые оболочки-оболочки и $ (...)
являются POSIX и более предпочтительны по нескольким причинам:
Обратные косые черты ( \
) внутри обратных кавычек обрабатываются в не- очевидным образом:
$ echo "` echo \\ a` "" $ (echo \\ a) "
a \ a
$ echo" `echo \\\\ a`" "$ (echo \\\\ a)"
\ a \\ a
# Обратите внимание, что это верно и для * одинарных кавычек *!
$ foo = `echo ' \\ ''; бар = $ (эхо '\\'); echo "foo - это $ foo, bar - это $ bar"
foo - \, bar - \\
Вложенное цитирование внутри $ ()
намного удобнее:
echo "x is $ (sed ...
вместо:
echo "x is` sed ...
или напишите что-то вроде:
IPs_inna_string =` awk "/ \` cat / etc / myname \ `/" '{print $ 1}' / etc / hosts`
, потому что $ ()
использует совершенно новый контекст для цитирования
, который не переносится, так как оболочки Bourne и Korn требуют этих обратных косых черт, а Bash и dash - нет.
Синтаксис для вложенных подстановок команд проще:
x = $ (grep "$ (dirname" $ path ")" file)
, чем:
x = `grep" \ `dirname \" $ path \ "\` "file`
, потому что $ ()
применяет совершенно новый контекст для цитирования, поэтому каждая подстановка команды защищена и может быть обработана самостоятельно, без особого беспокойства по поводу цитирования и экранирования. При использовании обратных кавычек он становится все уродливее и уродливее после двух и более уровней.
Еще несколько примеров:
echo `echo` ls`` # НЕПРАВИЛЬНО
echo `echo \` ls \ `` # ПРАВИЛЬНО
echo $ (echo $ (ls)) # ПРАВИЛЬНО
Решает проблему несогласованного поведения при использовании обратных кавычек:
echo '\ $ x'
выводит \ $ x
echo `echo '\ $ x' `
выводит $ x
echo $ (echo '\ $ x')
выводит \ $ x
Синтаксис обратных кавычек имеет исторические ограничения на содержимое встроенной команды и не может обрабатывать некоторые допустимые сценарии, содержащие обратные кавычки, тогда как новая форма $ ()
может обрабатывать любой допустимый встроенный сценарий.
Например, эти корректные встроенные скрипты не работают в левом столбце, но работают в правом IEEE :
echo `echo $ (
cat
Следовательно, синтаксис для $
-префикса подстановки команды должен быть предпочтительным методом, потому что он визуально ясен с чистым синтаксисом (улучшает читаемость человеком и машиной), он является вложенным и интуитивно понятным, его внутренний синтаксический анализ отделен, а также он более согласован (со всеми другими расширениями, которые анализируются внутри двойных кавычек), где обратные кавычки являются единственным исключением, а символ «
легко маскируется, когда он рядом с »
, что делает его еще более трудным для чтения, особенно с мелкими или необычными шрифтами.
Су rce: Почему $ (...)
предпочтительнее `...`
(обратные кавычки)? в BashFAQ
См. также:
Тильда не расширяется при цитировании. Вместо этого используйте реальную переменную, например $HOME
.
См. Почему тильда (~)не раскрывается внутри двойных кавычек?
Личное мнение :Свободное использование тильды в командной строке (с оговоркой, что она не раскрывается в кавычки ), а использование $HOME
является скриптом.