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

9

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

[email protected]:~# '
> ls
> '
ls
: command not found
[email protected]:~#
    
задан manikanta 08.03.2017 в 07:03
источник

2 ответа

22

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

От man bash :

PROMPTING

When executing interactively, bash displays the primary prompt PS1 when it is ready to read a command, and the secondary prompt PS2 when it needs more input to complete a command.

И немного раньше:

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

Таким образом, как вы можете догадаться, прочитав документацию, оболочки имеют несколько подсказок с различной целью. PS1 prompt - это ваша строка [email protected]:~# , которая обычно появляется при вводе команд. > - это сообщение 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 + новой строки. Такое имя исполняемого файла не может быть найдено (и, как правило, имена файлов команд должны состоять только из одной строки символов ascii). Хотя действительно возможно иметь имена файлов, которые содержат в себе специальные символы, всегда избегают.

ПРИМЕЧАНИЕ : поведение, показанное в вашем примере, специфично для оболочек, похожих на 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  

См. также:

ответ дан Sergiy Kolodyazhnyy 08.03.2017 в 07:40
источник
27

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

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

Так как нет такой команды, как <newline>ls<newline> , она не найдена.

    
ответ дан Zanna 08.03.2017 в 07:12