Что '(одинарная левая кавычка/обратная галочка) означает в командах?

Я не думаю, что это возможно, если Вы не можете заставить хвост закрывать и периодически вновь открыть файл. Один хвост (или любая другая программа) открывает файл, это получает дескриптор к inode того файла. В той точке больше не консультируются с именами файлов и ссылками. Именно поэтому можно удалить файл из файловой системы, и любая программа, которая имеет тот открытый файл, продолжит работать. Только когда; программа ast закрывает файл, что это на самом деле удалено из диска.

Обновление: По крайней мере, хвост версии на OS X имеет-F опцию, которая вновь откроет файл, если это переместилось.

174
28.06.2016, 14:48
6 ответов

Это - обратная галочка. Обратная галочка не является знаком цитаты. Это имеет совершенно особое значение. Все, что Вы вводите между обратными галочками, оценено (выполняемое) оболочкой перед основной командой (как 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

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

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

215
27.01.2020, 19:27
  • 1
    Это объясняет обратные галочки вполне прилично, но использование $(your expression)лучший путь состоит в том, чтобы сделать то же самое как $() позволяет Вам выражениям вложенного множества. например: cd $(dirname $(type -P touch)) будет CD Вы в каталог, содержащий touch команда –  Khaja Minhajuddin 27.12.2011, 03:10
  • 2
    @KhajaMinhajuddin Вы определенно правы относительно вложения - вышеупомянутый вопрос, покрывает его подробно. Но даже при том, что я думаю, что это - хорошая практика для использования $() в большинстве ситуаций это не делает обратные галочки худшей вещью. Практически, нужно признать, что они намного быстрее для ввода на командной строке (2 нажатий клавиш по сравнению с по крайней мере 5, включая Shift). –  rozcietrzewiacz 23.10.2012, 16:14
  • 3
    @rozcietrzewiacz, Ваш последний комментарий, вероятно, верен для большинства клавиатур, но $( ) определенно легче ввести, чем ` ` по крайней мере, на французской клавиатуре. –  jlliagre 19.05.2013, 23:38

Обратная галочка 'выполняет содержание вложенной строки, таким образом, что-то вроде этого

file `which hostname`

узнает путь к команде имени хоста и затем скажет Вам, как это было создано.

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

4
27.01.2020, 19:27

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

например:

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

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

2
27.01.2020, 19:27

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

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

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

Таким образом,

sudo chown $(id -u) /somedir

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

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

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

69
27.01.2020, 19:27

Одно пояснение, которое редко упоминается:

Обратные кавычки (иногда также называемые Грейвзом, потому что они используются как распространенный акцент во французском и других языках) заменяют Только стандартный вывод , но не стандартная ошибка.

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

file `which hostname`

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

file `which hostnameX`

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

which hostnameX

which hostnameX 2>/dev/null

В этом случае

file `which hostnameX` 

выдаст два сообщения об ошибках (первое из-за , 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 :)
10
27.01.2020, 19:27

Los acentos graves se asemejan a la sustitución de comandos. Esta sintaxis de backticks es arcaica, y es común saber que el signo de dólar con dos paréntesis:$().

¿Qué es la sustitución de mando?

La sustitución de comandos es una sola operación con sintaxis dedicada tanto para ejecutar un comando como para almacenar su salida en una variable para su uso posterior.

Un ejemplo con fecha:

thedate=$(date)

Entonces podríamos imprimir el resultado :'La fecha es %s\n' "$thedate" `.

  1. La sintaxis de sustitución de comandos es $().
  2. El comando en sí es date.
  3. Combinando ambos obtenemos $(date)cuya salida es la sustitución.
  4. Mostramos el valor de salida retenido por la variable con printf, según el comando anterior.
2
27.01.2020, 19:27

Теги

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