Dans quel mode le terminal entre-t-il lorsque je tape un seul devis?

11

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:~#
manikanta
la source
30
et pourquoi courez-vous en tant que root?
Zanna
13
Votre terminal est dans le même mode qu'auparavant - votre shell est dans un mode différent (en attendant la fin d'une chaîne avec une autre ')
ohno

Réponses:

26

En effet, le shell demande une commande / expression complète , et pour cette raison affiche la PS2chaî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' PS1invite est votre root@sai:~#chaîne, qui s'affiche normalement lorsque vous entrez des commandes. >est l' PS2invite. Il y en a aussi d'autres: PS3pour selectle bloc de commande et PS4pour le débogage avec la set -xcommande. Dans ce cas, nous sommes plus intéressés PS2.

Il existe de nombreuses façons dont le shell peut afficher l' PS2invite (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-docredirection (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. cshet ses dérivés ne se comportent pas de cette manière:

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

Cependant, en mode interactif, cshaugmentera toujours en ?tant que prompt2 lorsque plus de saisie est requise:

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

Voir également:

Sergiy Kolodyazhnyy
la source
Le lien What's the difference between <<, <<< and < < in bash?est hors ligne / incorrect.
Tico
@Tico Merci fixe. La réponse a été écrite avec une vitesse Internet de milli-tortues par seconde, ce qui n'a entraîné qu'un lien partiellement copié. Corrigé maintenant
Sergiy Kolodyazhnyy
3
Pendant ce temps, zsh a la gentillesse de vous dire ce qu'il attend, ce qui est parfois utile si vous pensiez que votre commande était valide mais que vous avez oublié d'échapper à quelque chose.
Kevin
30

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.

Zanna
la source