Я наткнулся на следующую команду:
sudo chown `id -u` /somedir
и мне интересно: что означает `
символ. Например, я заметил, что хотя приведенная выше команда работает хорошо, приведенная ниже не работает:
sudo chown 'id -u' /somedir
Это отступник . Бэктик не является кавычкой. Это имеет особое значение. Все, что вы вводите между обратными галочками, оценивается (выполняется) оболочкой перед основной командой (как chown
в ваших примерах), и выходные данные этого выполнения используются этой командой, как если бы вы печатали этот вывод в этом месте в командная строка.
И что
sudo chown `id -u` /somedir
Эффективно работает (в зависимости от вашего идентификатора пользователя ) это:
sudo chown 1000 /somedir
\ \ \ \
\ \ \ `-- the second argument to "chown" (target directory)
\ \ `-- your user ID, which is the output of "id -u" command
\ `-- "chown" command (change ownership of file/directory)
`-- the "run as root" command; everything after this is run with root privileges
Взгляните на этот вопрос, чтобы узнать, почему во многих ситуациях не рекомендуется использовать обратные метки.
Кстати, если вы когда-либо хотели использовать обратную косую черту буквально, например, в строке, вы можете избежать ее, поместив \
перед ней обратную косую черту ( ).
$(your expression)
- лучший способ сделать то же самое, что$()
позволяет вам вкладывать выражения. например:cd $(dirname $(type -P touch))
войдет в каталог, содержащийtouch
команду$()
в большинстве ситуаций, это не делает обратные удары хуже . Для практических целей нужно признать, что они гораздо быстрее набираются в командной строке (2 нажатия клавиш по сравнению с минимум 5 включительноShift
).$( )
определенно легче набрать, чем,` `
по крайней мере, на французской клавиатуре.Я хотел бы добавить еще несколько пунктов здесь.
Обратный удар
`…`
фактически называется подстановкой команд . Целью подстановки команд является оценка команды, которая находится внутри обратной черты, и предоставление ее результата в качестве аргумента для фактической команды.Подстановка команды может быть выполнена двумя способами: один использует,
$(…)
а другой - использует`…`
. Оба работают одинаково, но$(…)
форма является современным способом и имеет больше ясности и читабельности.И так
может быть предпочтительнее других.
И еще одна вещь, которую вы должны здесь отметить, это отношение подстановки команд с правилами цитирования bash, как упомянуто в документе bash .
источник
$(...)
гнезда лучше.$()
и"``"
не работают одинаковоОдна пояснительная записка редко освещается:
Обратные пометки (иногда также называемые Могилами, потому что они удваиваются как общий акцент на французском и других языках) заменяют только стандартный вывод , но не стандартную ошибку.
Итак, чтобы продолжить предыдущий пример:
будет работать как положено, но в:
which
вернет ошибку, и этот вывод перейдет к стандартной ошибке, а не подставляется в командную строку рядом сfile
; стандартного вывода вообще не будет, что можно подтвердить, выполнив:В этом случае,
выдаст два сообщения об ошибке (первое из-за самого себя,
which hostnameX
а второе сразу после первого из-за самого файла, которое обнаружит, что имя файла отсутствует, и, таким образом, вся командасущественно снизится до просто:
что, конечно, является неправильным использованием и возвратит ошибку использования.
(если вы хотите проверить это самостоятельно, вы можете попробовать:
источник
Backtick `запускает содержимое вложенной строки, так что-то вроде этого
найдет путь к команде hostname и расскажет, как она была построена.
Команда, которую вы задали в своем вопросе, выполняется
id -u
для получения эффективного идентификатора пользователя, а затем меняет владельца / somedir на этого пользователя.источник
Этот символ означает, что все, что внутри него, интерпретируется как результат этой команды.
например:
Вышеуказанное приводит к тому, что
three
каталог копируется в мой/home
каталог.источник
Бэкстики напоминают подстановку команд. Этот синтаксис обратных кавычек архаичен, и знать знак доллара с два скобкой является общей:
$()
.Что такое подстановка команд?
Подстановка команд - это отдельная операция с выделенным синтаксисом, которая выполняет как команду, так и вывод ее результатов в переменную для последующего использования.
Пример с датой:
Затем мы можем напечатать результат: 'Дата:% s \ n' "$ thedate" `.
$()
.date
.$(date)
что его выход является заменой.printf
помощью команды выше.источник