Що означає `(backquote / backtick) у командах?


159

Я натрапив на таку команду:

sudo chown `id -u` /somedir

і мені цікаво: яке значення `символу. Я помітив, наприклад, що в той час, як команда, що працює вище, працює добре, що наведена нижче, не:

sudo chown 'id -u' /somedir

Відповіді:


199

Це бетік . Наклейка - це не лапок. Це має дуже особливе значення. Все, що ви вводите між зворотними посиланнями, оцінюється (виконується) оболонкою перед основною командою (як 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, якщо ви коли-небудь хотіли використати backtick буквально, наприклад, в рядку, ви можете уникнути цього, поставивши \перед ним зворотну косу рису ( ).


36
Це досить добре пояснює події, але використання $(your expression)- це кращий спосіб зробити те саме, що $()дозволяє вкладати вирази. наприклад: cd $(dirname $(type -P touch))введе вас у каталог, що містить touchкоманду
Khaja Minhajuddin

11
@KhajaMinhajuddin Ви напевно маєте рацію щодо гніздування - вищезгадане питання детально висвітлює це питання . Але хоча я вважаю, що це корисна практика $()в більшості ситуацій, це не робить зворотній зв'язок гіршою справою. Для практичних цілей потрібно визнати, що вони набагато швидше набирати в командному рядку (2 натискання клавіш порівняно щонайменше з 5, у тому числі Shift).
rozcietrzewiacz

2
@rozcietrzewiacz Ваше останнє зауваження, мабуть, справедливо для більшості клавіатур, але $( )його, безумовно, простіше ввести, як ` `мінімум, на французькій клавіатурі.
jlliagre

1
@KhajaMinhajuddin Ви можете вкладати backticks, але вам потрібно уникнути 2-го рівня backticks, і 2-го рівня гніздування вам потрібно 3 backtikks, 3-го рівня гніздування 5 backticks, 4-го рівня 7, & c.
Джастін КБ

66

Я хотів би додати тут ще кілька балів.

Зворотний вибір `…`насправді називається заміною команд . Мета підстановки команд - оцінити команду, яка розміщена всередині backtick, та надати її результат як аргумент фактичної команди.

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

І так

sudo chown $(id -u) /somedir

можна віддати перевагу перед іншими.

І ще одне, що вам потрібно зауважити тут, - це зв'язок підстановки команд з правилами цитування bash, як зазначено в документі bash .

Якщо підміна відображається в подвійних лапках, розбиття слів і розширення імені файлів за результатами не виконується.


8
Також $(...)гніздяться краще.
Kusalananda

$()і "``"не працюють так само
Кун

10

Одна примітка уточнення рідко охоплювала:

Зворотні посилання (іноді їх також називають Graves, тому що вони є загальним акцентом у французькій та інших мовах) замінюють лише стандартний вихід , але не стандартний помилку.

Отже, щоб продовжити попередній приклад:

file `which hostname`

буде працювати, як очікувалося, але в:

file `which hostnameX`

whichповерне помилку, і цей вихід перейде до стандартної помилки, а не замінивши командний рядок поруч із file; стандартного виводу взагалі не буде, що ви можете підтвердити, запустивши:

which hostnameX

which hostnameX 2>/dev/null

В цьому випадку,

file `which hostnameX` 

видасть два повідомлення про помилку (перше, через, 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 :)

4

Backtick `запускає вміст додається рядка, тож щось подібне

file `which hostname`

з'ясує шлях до команди хоста, а потім розповість, як вона була побудована.

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


2

Цей символ означає, що все, що знаходиться всередині нього, трактується як результат цієї команди.

наприклад:

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

Вищезазначене призводить до того, що threeкаталог буде скопійовано до мого /homeкаталогу.


1

Повернення нагадує підстановку команд. Цей синтаксис зворотних лапок архаїчний, і знати знак долара з два дужкою є спільною: $().

Що таке підміна команд?

Підстановка команд - це одна операція з виділеним синтаксисом як для виконання команди, так і для того, щоб її вихід зберігався у змінній для подальшого використання.

Приклад з датою:

thedate=$(date)

Потім ми зможемо надрукувати результат: 'Дата -% s \ n' "$ thedate" `.

  1. Синтаксис підстановки команд є $().
  2. Сама команда є date.
  3. Поєднуючи обидва, ми отримуємо, результатом $(date)якого є підміна.
  4. Відображаємо значення вихідного значення, яке утримується змінною printf, за командою, наведеною вище.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.