web-dev-qa-db-fra.com

Que signifie <<<?

Que signifie <<<? Voici un exemple:

$ sed 's/a/b/g' <<< "aaa"
bbb

Est-ce quelque chose de général qui fonctionne avec plus de commandes Linux?

Il semble qu'il alimente le programme sed avec la chaîne aaa, mais n'est-ce pas << ou <habituellement utilisé pour cela?

136
Daniel Jonsson

D'autres ont répondu à la question fondamentale: qu'est-ce que c'est? Voyons pourquoi c'est utile.

Vous pouvez également alimenter une chaîne en stdin d'une commande comme ceci:

echo "$string" | command

Cependant, en bash, l'introduction d'un canal signifie que les commandes individuelles sont exécutées en sous-coquilles. Considère ceci:

echo "hello world" | read first second
echo $second $first

La sortie de la 2e commande echo imprime un seul espace. Whaaaa? Qu'est-il arrivé à mes variables? Étant donné que la commande de lecture est dans un pipeline, elle est exécutée dans un sous-shell. Il lit correctement 2 mots de son stdin et attribue aux variables. Mais alors la commande se termine, le sous-shell se termine et les variables sont perdues.

Parfois, vous pouvez contourner cela avec des accolades:

echo "hello world" | {
    read first second
    echo $second $first
}

C'est OK si votre besoin de valeurs est contenu, mais vous n'avez toujours pas ces variables dans le shell actuel de votre script. Pour remédier à cette situation confuse, utilisez une chaîne ici

read first second <<< "hello world"
echo $second $first

Ah, beaucoup mieux!

183
glenn jackman

<<< désigne une chaîne ici.

$ cat <<< 'hi there'
hi there

Il passe le mot à droite à l'entrée standard de la commande à gauche.


<< désigne un document ici.

$ cat <<EOF
> hi
> there
> EOF
hi
there

EOF peut être n'importe quel mot.

Ici, les documents sont couramment utilisés dans les scripts Shell pour créer des fichiers entiers ou pour afficher de longs messages.

cat > some-file <<FILE
foo
bar
bar bar
foo foo
FILE

< transmet le contenu d'un fichier à l'entrée standard d'une commande.

$ cat < /etc/fstab
/dev/sda2               /boot   ext4            nosuid,noexec,nodev,rw,noatime,nodiratime       0 2
/dev/sda4               /       ext4            rw,noatime,nodiratime,  0 1
/dev/sdb5               /var    ext4            nosuid,noexec,nodev,rw,relatime 0 2
 ...
84
user26112

Jetez un œil à la page de manuel de Bash . Cette notation fait partie de ce qu'on appelle un ici documente & ici des chaînes . Il vous permet de générer une entrée de données multi-lignes en une seule chaîne continue. La variation que vous demandez est appelée ici chaîne .

extrait de la page de manuel de Bash

Here Strings
   A variant of here documents, the format is:

          <<<Word

   The Word is expanded and supplied to the command on its standard input.
16
slm

Cela signifie ici des chaînes.

<<< strings

Les chaînes sont développées et fournies à la commande sur son entrée standard.

Dans votre exemple, les chaînes aaa sont transmises à la commande sed via stdin.

5
cuonglm