Что означает `(backquote /backtick) в командах?

Я наткнулся на следующую команду:

sudo chown `id -u` /somedir

и мне интересно: что означает символ `. Например, я заметил, что, хотя команда выше работает хорошо, ниже:

sudo chown 'id -u' /somedir
122 голоса | спросил gws 22 ThuEurope/Moscow2011-12-22T18:30:03+04:00Europe/Moscow12bEurope/MoscowThu, 22 Dec 2011 18:30:03 +0400 2011, 18:30:03

6 ответов


165

Это обратная сторона . Обратный знак не является котировочным знаком. Он имеет особое значение. Все, что вы вводите между backticks, оценивается (выполняется) оболочкой перед основной командой (например, chown в ваших примерах), а output этого исполнения используется этой командой , так же, как если бы вы набрали этот вывод в этом месте в командной строке.

Итак, что

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

Посмотрите этот вопрос , чтобы узнать, почему , во многих ситуациях не рекомендуется использовать обратные ссылки.

Btw, если вы когда-либо хотели использовать обратную линию буквально, например в строке, вы можете избежать ее, поместив обратную косую черту (\) перед ней.

ответил rozcietrzewiacz 22 ThuEurope/Moscow2011-12-22T18:43:26+04:00Europe/Moscow12bEurope/MoscowThu, 22 Dec 2011 18:43:26 +0400 2011, 18:43:26
52

Я хотел бы добавить еще несколько пунктов.

Обратный код `…` на самом деле называется замена команд . Цель подстановки команды - оценить команду, которая помещена внутри обратного выступа, и предоставить ее результат как аргумент фактической команде.

Подстановка команды может быть выполнена двумя способами: $(…), а другой - `…`. Оба работают одинаково, но форма $(…) является современным способом и имеет большую ясность и удобочитаемость.

Итак,

sudo chown $(id -u) /somedir

может быть предпочтительнее другого.

И еще одно, что вам нужно отметить, это command substitution с bash правила цитирования , как указано в bash document .

  

Если подстановка появляется в двойных кавычках, разбиение слов и   расширение файла не выполняется по результатам.

ответил Kannan Mohan 3 12014vEurope/Moscow11bEurope/MoscowMon, 03 Nov 2014 08:58:06 +0300 2014, 08:58:06
9

Одна нота разъяснений редко покрывается:

Backticks (иногда также называемый Graves, потому что он удваивается как общий акцент на французском и других языках) заменяет Стандартный вывод , но не стандартную ошибку.

Итак, чтобы продолжить предыдущий пример:

file `which hostname`

будет работать как ожидалось, но в:

file `which hostnameX`

which вернет ошибку, и этот вывод переходит в стандартную ошибку, вместо того, чтобы подставлять в командную строку рядом с file; стандартного вывода не будет, что вы можете подтвердить, выполнив:

which hostnameX

which hostnameX 2>/dev/null

В этом случае

file `which hostnameX` 

создаст сообщения two (первый из которых, из-за which hostnameX), а второй после первого, из-за самого файла, обнаруживает, что файл имя отсутствует, и поэтому вся команда

существенно сократится до:

file

, что, конечно, плохое использование, и вернет ошибку использования.

(если вы хотите проверить его самостоятельно, вы можете попробовать:

file `which hostnameX 2>/dev/null`    # just the file-command bad-usage error msg is printed

file `which hostnameX 2>/dev/null` 2>/dev/null  # now nothing is printed on the screen :)
ответил Dave K 12 +03002015-10-12T18:30:14+03:00312015bEurope/MoscowMon, 12 Oct 2015 18:30:14 +0300 2015, 18:30:14
3

Backtick `запускает содержимое вложенной строки, поэтому что-то вроде этого

file `which hostname`

узнает путь к команде hostname, а затем расскажет вам, как он был создан.

Команда, которую вы задали в своем вопросе, запускает id -u, чтобы получить эффективный идентификатор пользователя, а затем изменяет право собственности на /somedir на этого пользователя.

ответил Julian 22 ThuEurope/Moscow2011-12-22T18:41:31+04:00Europe/Moscow12bEurope/MoscowThu, 22 Dec 2011 18:41:31 +0400 2011, 18:41:31
2

Этот символ означает, что все, что внутри него интерпретируется как результат этой команды.

, например:

$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three

Приведенные выше результаты копируют каталог three, который копируется в мой каталог /home.

ответил Hanan N. 22 ThuEurope/Moscow2011-12-22T18:41:28+04:00Europe/Moscow12bEurope/MoscowThu, 22 Dec 2011 18:41:28 +0400 2011, 18:41:28
0

Обратные элементы напоминают подстановку команд. Этот синтаксис backticks является архаичным, и известно, что знак доллара с двумя скобками является общим: $().

Что такое подстановка команды?

Подстановка команд - это одна операция с выделенным синтаксисом для выполнения команды и для ее сохранения в переменной для последующего использования.

Пример с датой:

thedate=$(date)

Затем мы могли бы напечатать результат: 'Дата% s \ n' "$ thedate" `.

  1. Синтаксис подстановки команд: $().
  2. Сама команда date.
  3. Объединяя оба, мы получаем $(date), который является его результатом замены.
  4. Мы выводим значение выходного значения переменной с помощью printf, в соответствии с приведенной выше командой.
ответил user9303970 11 J0000006Europe/Moscow 2018, 19:29:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132