Lorsque j'entre un guillemet simple '
dans le terminal, il passe dans un autre mode et les commandes ne s'exécutent pas. Quel est ce mode et quand l'utilisons-nous?
root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
'
)
Lorsque j'entre un guillemet simple '
dans le terminal, il passe dans un autre mode et les commandes ne s'exécutent pas. Quel est ce mode et quand l'utilisons-nous?
root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
'
)
Réponses:
En effet, le shell demande une commande / expression complète , et pour cette raison affiche la PS2
chaîne d'invite.
De man bash
:
PROMOUVOIR
Lors de l'exécution interactive, bash affiche l'invite principale PS1 lorsqu'elle est prête à lire une commande et l'invite secondaire PS2 lorsqu'elle a besoin de plus d'entrée pour exécuter une commande.
Et un peu avant ça:
PS2 The value of this parameter is expanded as with PS1 and used as the secondary prompt string. The default is ``> ''.
Ainsi, comme vous pouvez le deviner à la lecture de la documentation, les shells ont plusieurs invites à des fins différentes. L' PS1
invite est votre root@sai:~#
chaîne, qui s'affiche normalement lorsque vous entrez des commandes. >
est l' PS2
invite. Il y en a aussi d'autres: PS3
pour select
le bloc de commande et PS4
pour le débogage avec la set -x
commande. Dans ce cas, nous sommes plus intéressés PS2
.
Il existe de nombreuses façons dont le shell peut afficher l' PS2
invite (et où l'exécution d'une commande sur une nouvelle ligne peut être nécessaire). La même invite est utilisée lorsque vous effectuez une here-doc
redirection (où une commande est considérée comme terminée lorsque vous voyez la chaîne de terminaison, dans cet exemple, EOF
):
$ cat <<EOF
> line one
> line two
> EOF
line one
line two
Très souvent, la poursuite d'une longue commande peut être effectuée en ajoutant \
un saut de ligne immédiat (!), Ce qui provoquera l'apparition de la même invite:
$ echo Hello\
> World
HelloWorld
$ echo 'Hello\
> World'
Hello\
World
Lorsque des canaux, des opérateurs logiques ou des mots clés spéciaux apparaissent sur la ligne de commande avant la nouvelle ligne, la commande est également considérée comme incomplète jusqu'à ce que toutes les instructions finales soient entrées:
$ 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
Dans votre cas particulier, une citation simple implique une interprétation littérale de ce qui se trouve entre les guillemets simples. Ainsi, comme l'a souligné Zanna, vous entrez une commande composée de retour à la ligne + ls
+ retour à la ligne. Un tel nom de fichier exécutable est introuvable (et les noms de fichiers de commande doivent généralement être composés uniquement de caractères alphanumériques, plus de traits de soulignement, de tirets et de points). Bien qu'il soit en effet possible d'avoir des noms de fichiers contenant des caractères spéciaux, cela est toujours évité.
REMARQUE : un tel comportement, comme illustré dans votre exemple, est spécifique aux shells de type Bourne, y compris bash
, dash
(sur Ubuntu, il est lié à /bin/sh
) ksh
, et mksh
. csh
et ses dérivés ne se comportent pas de cette manière:
$ tcsh
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%
Cependant, en mode interactif, csh
augmentera toujours en ?
tant que prompt2 lorsque plus de saisie est requise:
$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3
What's the difference between <<, <<< and < < in bash?
est hors ligne / incorrect.
Le shell n'attend que le devis de clôture. Lorsque vous le saisissez, il fera exactement ce qu'il fait habituellement et tentera d'exécuter la commande entrée.
Les citations empêchent le shell d'interpréter les caractères spéciaux, ce qui signifie que les extensions ne sont pas effectuées. Les guillemets simples suppriment complètement toute interprétation des caractères spéciaux. Normalement, une nouvelle ligne sépare les commandes, mais ici, vous avez inclus les nouvelles lignes dans le cadre de la commande en les citant.
Puisqu'il n'existe aucune commande telle que <newline>ls<newline>
, elle n'est pas trouvée.