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

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

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
11
задан 8 March 2017 в 18:40

2 ответа

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

От man 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

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

Примечание: такое поведение как показано в Вашем примере характерно для подобных Границе оболочек, включая bash, dash (на Ubuntu это - symlinked к /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  

См. также:

26
ответ дан 23 November 2019 в 03:49

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

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

С тех пор нет такой команды как <newline>ls<newline>, это не найдено.

30
ответ дан 23 November 2019 в 03:49

Другие вопросы по тегам:

Похожие вопросы: