Когда я ввожу одинарную кавычку '
в терминале это переходит к некоторому другому режиму, и команды не выполняются. Каков этот режим и когда мы используем его?
root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
Эффективно, оболочка просит полную команду/выражение и по этой причине отображается 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
Оболочка просто ожидает заключительной кавычки. При вводе его это сделает точно, что это обычно делает и пытается выполнить вводимую команду.
Кавычки заставляют оболочку не интерпретировать специальные символы, означая, что расширения не выполняются. Одинарные кавычки подавляют всю интерпретацию специальных символов полностью. Обычно новая строка разделяет команды, но здесь Вы включали новые строки как часть команды путем заключения в кавычки им.
С тех пор нет такой команды как <newline>ls<newline>
, это не найдено.