Какова цель cd `(backtick)?

56

Следующее ведет себя одинаково в Fedora и CentOS.

cd mydirectory

работает.

cd notadirectory

работает (получает ошибку от Bash).

Тем не мение,

cd `

дает мне какую-то подсказку:

>

Ничто из того, что я собирался ввести, не дает никакого ответа, оно просто отправляется на следующую строку, чтобы повторить запрос. Я просто использую CTRL+, Cчтобы вернуться обратно к моему root@localhost.

Какова цель этого и что можно с этим сделать?

Спасибо!

Mooseman
источник
6
Таким образом, ваш вопрос больше о >чем-то, что может произойти и в других ситуациях
Тобиас Кинцлер

Ответы:

123

То, что вы ввели, - это обратный удар - это начало инструкции bash для оценки того, что вы вводите в качестве команды. >Отображается указать , что вы все еще ввести команду на следующей строке.

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

~$ cd `
> echo /var`
/var$
Джон С
источник
17
Вы можете даже вкладывать их. Для более реалистичного примера: cd `dirname \`which ls\``= cd в каталог, где находится двоичный файл "ls". (то есть, cd /binтак как это /bin/ls) [править: тьфу, избегать этой уценки
ТРУДНО
54
@MSalters Вы , возможно , наткнулся на причину , почему современная Баш предпочитает , $()чтобы ``. Ваш пример (плюс правильное цитирование) станет cd "$(dirname "$(which ls)")"гораздо менее безумным.
Музер
31
@Muzer Это не просто bash, который предпочитает это, но рекомендуется в спецификации POSIX использовать $()над обратными кавычками.
Морская звезда
59

Ответ JohnC уже объясняет обратную черту. Но то, что вас также интересует, так это >быстрое. Это приглашение продолжения, и оно запускается не только обратным трюком, но и всегда, когда ваша оболочка четко знает, что вы не завершили ввод команды. Самый простой пример - поместить явное продолжение строки \в конец строки ввода (что помогает разбить длинный ввод):

$ echo \
> hallo

Обратите внимание, что так же, как PS1контролирует внешний вид командной строки, вы также PS2можете изменить приглашение продолжения, например

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

Есть много причин для продолжения. Один обратный удар не завершен, но вы также можете ввести что-то вроде

ls -l `which cp`

в одной строке (примечание: рекомендуется использовать $(и )вместо этого, поскольку круглые скобки указывают, где начинается и заканчивается расширение, в то время как одиночные метки в обратном порядке усложняют поиск того, где чего-то не хватает. И вложение ...). Другие возможные причины продолжения подсказки:

  • пропущенный doneпосле whileилиfor
  • пропавший fiпослеif
  • пропавший esacпослеcase
  • отсутствует закрывающая скобка, например, в подоболочках (cd $HOME; cat .bashrc)
  • пропущенная команда после конвейерной обработки, |а также условного выполнения ||и &&(не &смотря на то, что это просто делает команду запущенной в фоновом режиме)
  • отсутствует заключительная цитата ( 'или ")

Любопытно, что пропущенная фигурная скобка }после раскрытия переменной ${также вызывает приглашение продолжения, но завершится неудачей из-за вставленного пробела:

$ echo ${
> PS2}
bash: ${
PS2}: bad substitution
Тобиас Кинцлер
источник
2
И то же самое происходит при использовании кавычек :)
Steen Schütt
1
Я уже знал ответ на этот вопрос, когда увидел его на боковой панели, но я хотел дать вам дополнительное, хотя и мнимое +1, за очень хороший подробный ответ. Именно такой контент делает сайты StackExchange потрясающими. Так что ... Спасибо и продолжайте быть классным.
Unkwntech
4

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

Пример:

cd /tmp # Go to /tmp
pwd # Prints the current working  directory
ls `pwd` # Lists the content of the current working directory
Slyx
источник
0

Обратный удар запускает / заканчивает подстановку команды. Оболочка считывает команду внутри обратных кавычек, интерпретирует результаты и помещает эти результаты в команду. Например:. ls which cpприводит к выполнению «какого cp» и результат этой команды, т. е. / bin / cp будет использоваться в качестве аргумента команды ls. Это поведение, однако, не рекомендуется в пользу более явной и удобочитаемой подстановки команд $ (cmd).

При наборе cd `Оболочка ожидает, что команда будет выполнена, и будет закрыта с помощью обратной черты.

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

Николь Стивенс
источник