Відповіді:
Це бетік . Наклейка - це не лапок. Це має дуже особливе значення. Все, що ви вводите між зворотними посиланнями, оцінюється (виконується) оболонкою перед основною командою (як 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 буквально, наприклад, в рядку, ви можете уникнути цього, поставивши \
перед ним зворотну косу рису ( ).
$()
в більшості ситуацій, це не робить зворотній зв'язок гіршою справою. Для практичних цілей потрібно визнати, що вони набагато швидше набирати в командному рядку (2 натискання клавіш порівняно щонайменше з 5, у тому числі Shift
).
$( )
його, безумовно, простіше ввести, як ` `
мінімум, на французькій клавіатурі.
Я хотів би додати тут ще кілька балів.
Зворотний вибір `…`
насправді називається заміною команд . Мета підстановки команд - оцінити команду, яка розміщена всередині backtick, та надати її результат як аргумент фактичної команди.
Підстановку команд можна здійснити двома способами, один використовує, $(…)
а інший - `…`
. Обидва працюють однаково, але $(…)
форма є сучасним способом і має більшу чіткість і читабельність.
І так
sudo chown $(id -u) /somedir
можна віддати перевагу перед іншими.
І ще одне, що вам потрібно зауважити тут, - це зв'язок підстановки команд з правилами цитування bash, як зазначено в документі bash .
Якщо підміна відображається в подвійних лапках, розбиття слів і розширення імені файлів за результатами не виконується.
$(...)
гніздяться краще.
$()
і "``"
не працюють так само
Одна примітка уточнення рідко охоплювала:
Зворотні посилання (іноді їх також називають 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 :)
Backtick `запускає вміст додається рядка, тож щось подібне
file `which hostname`
з'ясує шлях до команди хоста, а потім розповість, як вона була побудована.
Команда, яку ви поставили у своєму запитанні, працює, id -u
щоб отримати ефективний ідентифікатор користувача, а потім змінює право власності на / somedir на цього користувача.
Повернення нагадує підстановку команд. Цей синтаксис зворотних лапок архаїчний, і знати знак долара з два дужкою є спільною: $()
.
Підстановка команд - це одна операція з виділеним синтаксисом як для виконання команди, так і для того, щоб її вихід зберігався у змінній для подальшого використання.
thedate=$(date)
Потім ми зможемо надрукувати результат: 'Дата -% s \ n' "$ thedate" `.
$()
.date
.$(date)
якого є підміна.printf
, за командою, наведеною вище.
$(your expression)
- це кращий спосіб зробити те саме, що$()
дозволяє вкладати вирази. наприклад:cd $(dirname $(type -P touch))
введе вас у каталог, що міститьtouch
команду