Odpowiedzi:
To jest backtick . Strzałka wsteczna nie jest znakiem cudzysłowu. Ma to bardzo szczególne znaczenie. Wszystko, co wpisujesz między backtickami, jest analizowane (wykonywane) przez powłokę przed głównym poleceniem (jak chown
w twoich przykładach), a dane wyjściowe z tego wykonania są używane przez to polecenie, tak jakbyś wpisał to wyjście w tym miejscu w wiersz poleceń.
Więc co
sudo chown `id -u` /somedir
skutecznie działa (w zależności od identyfikatora użytkownika ) to:
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
Spójrz na to pytanie, aby dowiedzieć się, dlaczego w wielu sytuacjach nie jest dobrym pomysłem stosowanie back -icksów.
Przy okazji, jeśli kiedykolwiek chciałeś użyć dosunięcia dosłownie, np. W ciągu, możesz uciec od niego, umieszczając \
przed nim odwrotny ukośnik ( ).
$()
w większości sytuacji, nie robi to gorszych zwrotów. Ze względów praktycznych trzeba przyznać, że pisanie w wierszu poleceń jest znacznie szybsze (2 naciśnięcia klawiszy w porównaniu do co najmniej 5, w tym Shift
).
$( )
zdecydowanie łatwiej ją pisać niż ` `
przynajmniej na klawiaturze francuskiej.
Chciałbym tu dodać jeszcze kilka punktów.
Strzałka wsteczna `…`
nazywana jest w rzeczywistości zastępowaniem poleceń . Podstawienie polecenia polega na ocenie polecenia umieszczonego w backstick i dostarczeniu jego wyniku jako argumentu do rzeczywistego polecenia.
Podstawienie polecenia można wykonać na dwa sposoby, z których jeden jest używany, $(…)
a drugi jest `…`
. Oba działają tak samo, ale $(…)
forma jest nowoczesna i ma większą przejrzystość i czytelność.
A więc
sudo chown $(id -u) /somedir
mogą być preferowane nad innymi.
I jeszcze jedna rzecz, na którą należy zwrócić uwagę, to relacja zastępowania poleceń z regułami cytowania bash, jak wspomniano w dokumencie bash .
Jeśli podstawienie pojawia się w podwójnych cudzysłowach, dzielenie słów i rozwijanie nazw plików nie są wykonywane w wynikach.
$(...)
gniazduje lepiej.
$()
i "``"
nie działają w ten sam sposób
Jedna uwaga wyjaśnienia rzadko obejmuje:
Backticks (czasami nazywany także Graves, ponieważ podwaja się jako wspólny akcent w języku francuskim i innych językach) zastępują tylko Standardowy Wyjście , ale nie Standardowy Błąd.
Kontynuując poprzedni przykład:
file `which hostname`
będzie działać zgodnie z oczekiwaniami, ale w:
file `which hostnameX`
which
zwróci błąd, a dane wyjściowe zostaną zastąpione błędem standardowym, zamiast zastępowania w wierszu poleceń obok file
; w ogóle nie będzie standardowego wyjścia, które można potwierdzić, uruchamiając:
which hostnameX
which hostnameX 2>/dev/null
W tym przypadku,
file `which hostnameX`
wyświetli dwa komunikaty o błędach (pierwszy z powodu, which hostnameX
a drugi zaraz po poprzednim z powodu samego pliku, w którym wykryto brak nazwy pliku, a więc całe polecenie
zmniejszy się zasadniczo do:
file
co oczywiście jest złym użytkowaniem i zwróci błąd użytkowania.
(jeśli chcesz to sprawdzić samodzielnie, możesz spróbować:
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 `uruchamia zawartość dołączonego ciągu, więc coś takiego
file `which hostname`
znajdzie ścieżkę do komendy hostname, a następnie powie ci, jak została zbudowana.
Polecenie wprowadzone w pytaniu uruchamia się, id -u
aby uzyskać efektywny identyfikator użytkownika, a następnie zmienia własność / somedir na tego użytkownika.
Cofnięcia przypominają podstawianie poleceń. Ta składnia backticks jest archaiczna i wiem, znak dolara z dwóch nawias jest wspólne: $()
.
Podstawienie polecenia jest pojedynczą operacją ze specjalną składnią, która służy zarówno do wykonania polecenia, jak i do zapisania jego wyniku w zmiennej do późniejszego użycia.
thedate=$(date)
Możemy wtedy wydrukować wynik: „Data to% s \ n” „$ thedate”.
$()
.date
.$(date)
którego wynikiem jest podstawienie.printf
, zgodnie z powyższym poleceniem.
$(your expression)
jest lepszym sposobem na zrobienie tego samego, co$()
pozwala zagnieżdżać wyrażenia. na przykład:cd $(dirname $(type -P touch))
przeniesie cię do katalogu zawierającegotouch
komendę