Почему я иногда получаю многократные подсказки с «>» в ​​терминале?


19

Хорошо, когда я запускаю определенные команды неправильным образом (с ошибками и т. Д.), Терминал выводит это: >вместо computername:workingfolder username$, и когда я набираю команду enter, она выглядит следующим образом:

>

>

>

Это было бы, если бы я нажал ввод 3 раза.

Ответы:


43

> это приглашение продолжения по умолчанию. Это то, что вы увидите, если то, что вы ввели ранее, имеет несбалансированные кавычки.

Например, введите в командной строке одинарную кавычку и несколько enterклавиш:

$ '
> 
> 
> 

Запросы продолжения будут происходить до тех пор, пока вы

  • (а) завершить команду закрывающей кавычкой

    или

  • (b) введите Ctrl+ Dдля завершения ввода, после чего оболочка ответит сообщением об ошибке о несбалансированных кавычках,

    или

  • (c) напечатайте Ctrl+, Cчтобы прервать вводимую вами команду.

Как это полезно

Иногда вы можете захотеть ввести строку, содержащую новые строки. Вы можете сделать это следующим образом:

$ paragraph='first line
> second line
> third line
> end'

Теперь, когда мы отображаем эту переменную оболочки, вы можете видеть, что подсказки исчезли, но новые строки остались:

$ echo "$paragraph"
first line
second line
third line
end

16

Это произойдет, если в вашей команде есть открытая кавычка. Это что-то вроде:

$ echo "test here
>
>
...

Вы можете выйти из этого режима, закрыв кавычку (напишите "или ', или как там ваша открытая кавычка) Это также может быть блок с разделителями в скобках, частично полный цикл for-doили while-doцикл, или некоторые другие конструкции. Вы также можете нажать, Ctrl-Cчтобы отменить эту команду (затем нажмите, Upчтобы изменить ее).

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


Это >ваше PS2(«вторичное приглашение») значение. Вы можете изменить это на что-то другое, чтобы напомнить вам, что произошло:

PS2="Unclosed >"

в вашем .bashrcсделает печать Unclosed >в начале каждой строки вместо этого.


7

В дополнение к другим ответам вы также получаете приглашение продолжения, когда вы вводите \последний символ в строке.


5
(Для меня это обычно происходит случайно, так как обратная косая черта пугающе близка к клавише Enter.)
Мистер Листер

Не на моей клавиатуре , это не так.
TRiG

@TRiG Вы имеете в виду, что вы часто пишете # случайно вместо \? Верно ...
Мистер Листер

7

Ответ заключается в этом загадочном упоминании в Справочном руководстве Bash :

5.1 Переменные оболочки Bourne

[...]

  • PS1: Строка первичного приглашения. Значением по умолчанию является ' \s-\v\$'. См. Печать приглашения , чтобы увидеть полный список escape-последовательностей, которые были развернуты до того, PS1как отобразится.
  • PS2: Строка вторичного приглашения. Значением по умолчанию является ' >'.

... затем :

6.3.3 Интерактивное поведение оболочки

  1. Bash раскрывается и отображается PS1перед чтением первой строки команды, а раскрывается и отображается PS2перед чтением второй и последующих строк многострочной команды.

Таким образом, >приглашение появляется, если вы нажимаете, Enterи Bash определяет, что команда не завершена. Это может быть потому, что:

  • Символ перед новой строкой - это символ \, который рассматривается как продолжение строки .
  • У вас есть неполная строка (несовпадающие кавычки или несогласованный здесь-ДОК) или некоторые другие несоответствующие разделители, такие как $(), (),`` .
  • Вы запустили определение функции, forцикл, whileцикл или case.

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


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

6

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.