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:~#
'
)
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:~#
'
)
Risposte:
In effetti, la shell richiede un comando / espressione completi e per questo motivo visualizza la PS2
stringa 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 PS1
prompt è la tua root@sai:~#
stringa, che appare normalmente quando inserisci i comandi. >
è il PS2
prompt. Ce ne sono anche altri: PS3
per il select
blocco comandi e PS4
per il debug con set -x
comando. In questo caso ci interessa di più PS2
.
Esistono molti modi in cui la shell può mostrare il PS2
prompt (e dove potrebbe essere necessario completare un comando su una nuova riga). Lo stesso prompt viene utilizzato quando si esegue il here-doc
reindirizzamento (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
), ksh
e mksh
. csh
e i suoi derivati non si comportano in questo modo:
$ tcsh
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%
Tuttavia, in modalità interattiva, csh
aumenterà comunque ?
come prompt2 quando è richiesto più input:
$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3
What's the difference between <<, <<< and < < in bash?
è offline / errato.
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.