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