Коли я ввожу одну цитату 'в термінал, вона переходить в інший режим, і команди не виконуються. Що це за режим і коли ми ним користуємося?
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
У вашому конкретному випадку одна ціна передбачає буквальне тлумачення того, що є між цитатами. Таким чином, як зазначила Занна, ви вводите команду, яка складається з 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?офлайн / неправильно.
Оболонка просто чекає завершальної цитати. Коли ви введете його, він зробить саме те, що зазвичай робить, і спробує виконати введену команду.
Цитати змушують оболонку не інтерпретувати спеціальні символи, тобто розширення не виконуються. Одиночні цитати пригнічують всю інтерпретацію спеціальних символів повністю. Зазвичай новий рядок розділяє команди, але тут ви включили нові рядки як частину команди, цитуючи їх.
Оскільки немає такої команди як <newline>ls<newline>, вона не знайдена.