В какой режим входит терминал, когда я набираю одинарную кавычку?


11

Когда я ввожу одинарную кавычку 'в терминале, он переходит в какой-то другой режим, и команды не выполняются. Что это за режим и когда мы его используем?

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#

30
и почему вы работаете от имени пользователя root?
Занна

13
Ваш терминал находится в том же режиме, что и раньше - ваша оболочка находится в другом режиме (ожидание завершения строки другой ')
ohno

Ответы:


26

По сути, оболочка запрашивает полную команду / выражение и по этой причине отображает PS2строку приглашения.

От man bash:

ПРИГЛАШЕНИЯ

При интерактивном выполнении bash отображает первичное приглашение PS1, когда оно готово к чтению команды, и вторичное приглашение PS2, когда ему нужно больше ввода для выполнения команды.

И немного до этого:

  PS2    The value of this parameter is  expanded
          as  with  PS1  and used as the secondary
          prompt string.  The default is ``> ''.

Таким образом, как вы можете догадаться из прочтения документации, оболочки имеют несколько подсказок с разными целями. PS1Подсказка ваша root@sai:~#строка, которая появляется обычно при вводе команд. >это PS2подсказка. Есть и другие: PS3для selectблока команд и PS4для отладки с помощью set -xкоманды. В этом случае нас больше интересует PS2.

Существует много способов, которыми оболочка может отображать PS2приглашение (и где может потребоваться выполнение команды на новой строке). То же самое приглашение используется, когда вы выполняете here-docперенаправление (где команда считается завершенной, когда вы видите завершающую строку, в этом примере EOF):

$ cat <<EOF
> line one
> line two
> EOF
line one
line two

Очень часто продолжение длинной команды может быть сделано путем добавления \и немедленной (!) Новой строки, что приведет к появлению того же приглашения:

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World

Когда в командной строке перед новой строкой появляются каналы, логические операторы или специальные ключевые слова, команда также считается неполной до тех пор, пока не будут введены все последние операторы:

$ echo Hello World | 
> wc -l
1

$ echo Hello World &&                                                                                                    
> echo "!"
Hello World
!

$ for i in $(seq 1 3); do
> echo "$i"
> done
1
2
3 

$ if [ -f /etc/passwd ]
> then
>     echo "YES"
> fi
YES

В вашем конкретном случае, одиночная кавычка подразумевает буквальную интерпретацию того, что находится между одинарными кавычками. Таким образом, как указала Занна, вы вводите команду, которая состоит из новой строки + ls+ новой строки. Такое исполняемое имя файла не может быть найдено (и обычно имена команд должны состоять только из буквенно-цифровых символов, а также подчеркивания, тире и точек). Хотя действительно возможно иметь имена файлов, содержащие специальные символы, их всегда избегают.

ПРИМЕЧАНИЕ : такое поведение, как показано в вашем примере, относится только к оболочкам, похожим на Bourne, в том числе bash, dash(в Ubuntu оно имеет символическую ссылку /bin/sh) kshи mksh. cshи его производные не ведут себя так:

$ tcsh                                                    
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%  

Тем не менее, в интерактивном режиме cshвсе равно будет вызываться ?как prompt2, когда требуется больше ввода:

$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3  

Смотрите также:


Ссылка What's the difference between <<, <<< and < < in bash?оффлайн / неверная.
Тико

@ Тико Спасибо исправлено. Ответ был написан со скоростью интернета милли-черепах в секунду, что привело только к частично скопированной ссылке. Исправлено
Сергей Колодяжный

3
Между тем, zsh достаточно любезен, чтобы на самом деле сказать вам, чего он ожидает, что иногда полезно, если вы считаете, что ваша команда действительна, но забыли что-то избежать.
Кевин

30

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

Кавычки заставляют оболочку не интерпретировать специальные символы, что означает, что расширения не выполняются. Одинарные кавычки полностью подавляют всю интерпретацию специальных символов. Обычно новая строка разделяет команды, но здесь вы включили новые строки как часть команды, заключив их в кавычки.

Поскольку такой команды нет <newline>ls<newline>, она не найдена.

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