In quale modalità entra il terminale quando digito una singola citazione?


11

Quando inserisco una virgoletta singola 'nel terminale, passa ad un'altra modalità e i comandi non vengono eseguiti. Cos'è questa modalità e quando la usiamo?

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

30
e perché corri come root?
Zanna

13
Il tuo terminale è nella stessa modalità di prima - la tua shell è in una modalità diversa (in attesa del completamento di una stringa con un'altra ')
ohno

Risposte:


26

In effetti, la shell richiede un comando / espressione completi e per questo motivo visualizza la PS2stringa del prompt.

Da man bash:

PROMPTING

Quando si esegue in modo interattivo, bash visualizza il prompt primario PS1 quando è pronto per leggere un comando e il prompt secondario PS2 quando necessita di più input per completare un comando.

E poco prima:

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

Pertanto, come si può immaginare leggendo la documentazione, le shell hanno più richieste con scopi diversi. Il PS1prompt è la tua root@sai:~#stringa, che appare normalmente quando inserisci i comandi. >è il PS2prompt. Ce ne sono anche altri: PS3per il selectblocco comandi e PS4per il debug con set -xcomando. In questo caso ci interessa di più PS2.

Esistono molti modi in cui la shell può mostrare il PS2prompt (e dove potrebbe essere necessario completare un comando su una nuova riga). Lo stesso prompt viene utilizzato quando si esegue il here-docreindirizzamento (in cui un comando è considerato completo quando si vede la stringa di terminazione, in questo esempio EOF):

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

Molto spesso la continuazione di un lungo comando può essere fatta aggiungendo \e una nuova riga immediata (!), Che farà apparire lo stesso prompt:

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World

Quando pipe, operatori logici o parole chiave speciali vengono visualizzati nella riga di comando prima di newline, anche il comando viene considerato incompleto fino all'inserimento di tutte le istruzioni finali:

$ 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

Nel tuo caso particolare, una singola citazione implica un'interpretazione letterale di ciò che è tra le singole virgolette. Quindi, come ha sottolineato Zanna, stai inserendo un comando che consiste in newline + ls+ newline. Non è possibile trovare un tale nome di file eseguibile (e in genere i nomi dei file di comando devono essere composti solo da caratteri alfanumerici, oltre a trattini bassi, trattini e punti). Sebbene sia effettivamente possibile avere nomi di file che contengono caratteri speciali, viene sempre evitato.

NOTA : tale comportamento, come mostrato nel tuo esempio è specifico per Bourne-come gusci, tra cui bash, dash(su Ubuntu è collegato simbolicamente a /bin/sh), kshe mksh. cshe i suoi derivati ​​non si comportano in questo modo:

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

Tuttavia, in modalità interattiva, cshaumenterà comunque ?come prompt2 quando è richiesto più input:

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

Guarda anche:


Il collegamento What's the difference between <<, <<< and < < in bash?è offline / errato.
Tico

@Tico Grazie risolto. La risposta è stata scritta con una velocità Internet di mille-tartarughe al secondo, che ha prodotto solo un link parzialmente copiato. Risolto ora
Sergiy Kolodyazhnyy

3
Nel frattempo, zsh è abbastanza gentile da dirti effettivamente cosa sta aspettando, il che è talvolta utile se pensavi che il tuo comando fosse valido ma hai dimenticato di sfuggire a qualcosa.
Kevin

30

La shell sta solo aspettando il preventivo di chiusura. Quando lo inserisci, farà esattamente ciò che fa di solito e tenta di eseguire il comando inserito.

Le virgolette impediscono alla shell di interpretare caratteri speciali, il che significa che le espansioni non vengono eseguite. Le virgolette singole sopprimono completamente ogni interpretazione di caratteri speciali. Normalmente una newline separa i comandi, ma qui hai incluso le newline come parte del comando citandole.

Poiché non esiste un comando come <newline>ls<newline>, non viene trovato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.