Jaki jest cel cd `(backtick)?

57

Poniższe zachowuje się tak samo w Fedorze i CentOS.

cd mydirectory

Pracuje.

cd notadirectory

działa (pobiera błąd z Bash).

Jednak,

cd `

daje mi jakiś monit:

>

Nic, co chciałem wprowadzić, nie daje żadnej odpowiedzi, po prostu przechodzi do następnej linii, aby ponownie zapytać. Po prostu używam CTRL+, Caby wrócić do mojego root@localhost.

Jaki jest tego cel i co można z tym zrobić?

Dzięki!

Mooseman
źródło
6
Więc twoje pytanie dotyczy bardziej >niż tykania wstecznego, ponieważ może się to zdarzyć także w innych sytuacjach
Tobias Kienzler

Odpowiedzi:

124

To, co wpisałeś, to backstick - jest to początek instrukcji bash, aby ocenić, co wpisujesz jako polecenie. >Jest wyświetlany w celu wskazania nadal wprowadzając komendę w następnym wierszu.

Jeśli zamkniesz lewy tyknięcie, przekonasz się, że uruchomi się całe polecenie. Na przykład

~$ cd `
> echo /var`
/var$
John C.
źródło
17
Możesz nawet zagnieździć je. Dla nieco realistycznego przykładu: cd `dirname \`which ls\``= cd do katalogu, w którym znajduje się plik binarny „ls”. (tj. cd /binponieważ to jest /bin/ls) [edytuj: uff, ucieczka przed
obniżką jest trudna
54
@MSalters pan może natknął powód nowoczesny bash preferuje $()się ``. Twój przykład (plus prawidłowe cytowanie) stałby się cd "$(dirname "$(which ls)")"znacznie mniej szalony.
Muzer
31
@Muzer Preferuje nie tylko bash, ale zaleca się stosowanie $()go w specyfikacji POSIX zamiast cudzysłowów .
Rozgwiazda
59

Odpowiedź JohnC już wyjaśnia backtick. Ale zastanawiasz się również nad >pytaniem. Jest to monit o kontynuację i jest uruchamiany nie tylko przez kliknięcie wstecz, ale zawsze, gdy powłoka wyraźnie wie, że nie skończyłeś wpisywać polecenia. Najłatwiejszym przykładem jest umieszczenie wyraźnej kontynuacji linii \na końcu linii wejściowej (co pomaga podzielić długie dane wejściowe):

$ echo \
> hallo

Pamiętaj, że podobnie jak PS1kontroluje wygląd wiersza polecenia, możesz także ustawić PS2zmianę wiersza kontynuacji, np

$ export PS2="(cont.) "
$ echo \
(cont.) hallo

Istnieje wiele przyczyn kontynuacji. Pojedynczy ruch wstecz jest niekompletny, ale możesz także wpisać coś takiego

ls -l `which cp`

w jednym wierszu (uwaga: zalecane jest użycie $(i )zamiast tego, ponieważ w nawiasach widać, gdzie zaczyna się i kończy ekspansja, a pojedyncze cofnięcia utrudniają zobaczenie, gdzie brakuje. I zagnieżdżanie ...). Inne możliwe przyczyny monitu o kontynuację:

  • zaginiony donepo whilelubfor
  • zaginiony fipoif
  • zaginiony esacpocase
  • brakujący nawias zamykający, np. w podpowłokach (cd $HOME; cat .bashrc)
  • brakujące polecenie po potoku, |a także wykonanie warunkowe ||i &&( &choć nie , ponieważ powoduje to, że polecenie działa w tle)
  • brakujący cytat zamykający ( 'lub ")

Co ciekawe, brakujący nawias }po rozszerzeniu zmiennej ${powoduje również monit o kontynuację, ale nie powiedzie się z powodu wstawionej spacji:

$ echo ${
> PS2}
bash: ${
PS2}: bad substitution
Tobias Kienzler
źródło
2
I to samo dzieje się przy użyciu cytatów :)
Steen Schütt
1
Znałem już odpowiedź na to pytanie, kiedy zobaczyłem je na pasku bocznym, ale chciałem dać ci dodatkową, choć wyobrażoną, +1 za bardzo miłą, dogłębną odpowiedź. Jest to rodzaj treści, która sprawia, że ​​strony StackExchange są niesamowite. Więc ... Dzięki i bądźcie niesamowici.
Unkwntech
4

Oznacza to, że twoje polecenie jeszcze się nie zakończyło. W rzeczywistości znak wstecznego znaku `służy do rozgraniczenia polecenia wbudowanego.

Przykład:

cd /tmp # Go to /tmp
pwd # Prints the current working  directory
ls `pwd` # Lists the content of the current working directory
Slyx
źródło
0

Strzałka wsteczna rozpoczyna / kończy zastępowanie poleceń. Powłoka odczytuje polecenie wewnątrz backticksa, interpretuje wyniki i umieszcza je w poleceniu. Na przykład:. ls which cppowoduje wykonanie „what cp”, a wynik tej komendy, tj. / bin / cp zostanie użyty jako argument komendy ls. To zachowanie jest jednak przestarzałe, na korzyść bardziej wyraźnego i czytelnego podstawiania poleceń $ (cmd).

Podczas wpisywania cd `Powłoka oczekuje, że polecenie zostanie wykonane, a następnie zostanie zamknięte za pomocą backsticka.

W przypadku rozszerzania zmiennej za pomocą nawiasów, powłoka wyświetla monit o kontynuację, ponieważ nawiasy te są oceniane leksykalnie przed wykonaniem rozwinięcia.

Nicole Stevens
źródło