У який режим переходить термінал, коли я набираю одну цитату?


11

Коли я ввожу одну цитату 'в термінал, вона переходить в інший режим, і команди не виконуються. Що це за режим і коли ми ним користуємося?

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

30
і чому ти працюєш як root?
Занна

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

Відповіді:


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

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

ПРИМІТКА : така поведінка, як показано у вашому прикладі, характерна для оболонок, подібних до Борна, у тому числі bash, dash(для Ubuntu вона посилається на /bin/sh) ksh, та mksh. cshі його похідні не ведуть себе таким чином:

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

Однак в інтерактивному режимі cshвсе одно буде підніматися ?як підказка2, коли потрібно більше введення:

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

Дивіться також:


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

@Tico Спасибі виправлено. Відповідь була написана зі швидкістю Інтернет-черепах в секунду, що призвело лише до частково скопійованого посилання. Виправлено зараз
Сергій Колодяжний

3
Тим часом zsh є досить люб'язним, щоб насправді розповісти, що його чекає, що іноді корисно, якщо ти вважав, що твоя команда дійсна, але забув щось уникнути.
Кевін

30

Оболонка просто чекає завершальної цитати. Коли ви введете його, він зробить саме те, що зазвичай робить, і спробує виконати введену команду.

Цитати змушують оболонку не інтерпретувати спеціальні символи, тобто розширення не виконуються. Одиночні цитати пригнічують всю інтерпретацію спеціальних символів повністю. Зазвичай новий рядок розділяє команди, але тут ви включили нові рядки як частину команди, цитуючи їх.

Оскільки немає такої команди як <newline>ls<newline>, вона не знайдена.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.