W jaki tryb wchodzi terminal, gdy piszę pojedynczy cytat?

11

Kiedy wprowadzam pojedynczy cudzysłów 'w terminalu, przechodzi on w inny tryb i polecenia nie są wykonywane. Co to jest ten tryb i kiedy go używamy?

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
manikanta
źródło
30
i dlaczego działasz jako root?
Zanna
13
Twój terminal jest w tym samym trybie co poprzednio - twoja skorupa jest w innym trybie (czekając na zakończenie łańcucha z innym ')
ohno

Odpowiedzi:

26

W efekcie powłoka prosi o podanie pełnego polecenia / wyrażenia iz tego powodu wyświetla PS2ciąg zachęty.

Od man bash:

PODSZEPT

Podczas wykonywania interaktywnego, bash wyświetla główny monit PS1, gdy jest gotowy do odczytania polecenia, i dodatkowy monit PS2, gdy potrzebuje więcej danych do wykonania polecenia.

A nieco wcześniej:

  PS2    The value of this parameter is  expanded
          as  with  PS1  and used as the secondary
          prompt string.  The default is ``> ''.

Tak więc, jak można się domyślić po przeczytaniu dokumentacji, powłoki mają wiele podpowiedzi w różnych celach. PS1Szybka to root@sai:~#ciąg, który pojawia się zwykle podczas wprowadzania poleceń. >jest PS2monitem. Są też inne: PS3do selectbloku poleceń i PS4do debugowania za pomocą set -xpolecenia. W tym przypadku jesteśmy bardziej zainteresowani PS2.

Istnieje wiele sposobów wyświetlania PS2zachęty przez powłokę (i gdzie konieczne może być wypełnienie polecenia w nowym wierszu). Ten sam monit jest używany podczas wykonywania here-docprzekierowania (w którym polecenie jest uważane za zakończone, gdy zobaczysz ciąg kończący, w tym przykładzie EOF):

$ cat <<EOF
> line one
> line two
> EOF
line one
line two

Bardzo często kontynuację długiego polecenia można wykonać przez dodanie \i natychmiastowego (!) Znaku nowej linii, co spowoduje pojawienie się tego samego monitu:

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World

Kiedy potoki, operatory logiczne lub specjalne słowa kluczowe pojawiają się w wierszu poleceń przed znakiem nowej linii, polecenie jest również uważane za niekompletne, dopóki nie zostaną wprowadzone wszystkie końcowe instrukcje:

$ 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

W twoim konkretnym przypadku pojedynczy cytat oznacza dosłowną interpretację tego, co znajduje się pomiędzy pojedynczymi cytatami. Zatem, jak wskazała Zanna, wpisujesz polecenie składające się z nowej linii + ls+ nowej linii. Nie można znaleźć takiej wykonywalnej nazwy pliku (i zazwyczaj nazwy plików poleceń powinny składać się wyłącznie ze znaków alfanumerycznych oraz znaków podkreślenia, myślników i kropek). Chociaż rzeczywiście możliwe jest posiadanie nazw plików zawierających znaki specjalne, zawsze można tego uniknąć.

UWAGA : takie zachowanie, jak pokazano w twoim przykładzie, jest specyficzne dla powłok podobnych do Bourne'a, w tym bash: dash(na Ubuntu jest to dowiązanie symboliczne /bin/sh) ksh, i mksh. csha jego pochodne nie zachowują się w taki sposób:

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

Jednak w trybie interaktywnym cshnadal będzie wyświetlany ?jako monit2, gdy wymagane jest więcej danych wejściowych:

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

Zobacz też:

Sergiy Kolodyazhnyy
źródło
Link What's the difference between <<, <<< and < < in bash?jest offline / zły.
Tico
@Tico Dzięki naprawiono. Odpowiedź została napisana z szybkością Internetu w milionach żółwi na sekundę, co spowodowało tylko częściowo skopiowany link. Naprawiono teraz
Sergiy Kolodyazhnyy
3
Tymczasem zsh jest na tyle uprzejmy, aby powiedzieć ci, na co czeka, co jest czasami przydatne, jeśli uważasz, że twoje polecenie jest prawidłowe, ale zapomniałeś czegoś uciec.
Kevin
30

Powłoka czeka tylko na końcowy cytat. Gdy go wpiszesz, zrobi dokładnie to, co zwykle, i spróbuje wykonać wprowadzone polecenie.

Cytaty powodują, że powłoka nie interpretuje znaków specjalnych, co oznacza, że ​​rozszerzenia nie są wykonywane. Pojedyncze cudzysłowy całkowicie eliminują wszelkie interpretacje znaków specjalnych. Zwykle nowa linia rozdziela polecenia, ale tutaj uwzględniłeś nowe linie jako część polecenia, cytując je.

Ponieważ nie ma takiej komendy jak <newline>ls<newline>, nie można jej znaleźć.

Zanna
źródło