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:~#
')
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:~#
')
Odpowiedzi:
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
What's the difference between <<, <<< and < < in bash?jest offline / zły.
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źć.