Bizarreries de redirection d'entrée de script shell

Quelqu'un peut-il expliquer ce comportement ? En cours d'exécution :

#!/bin/sh
echo 'hello world' | read var1 var2
echo $var1
echo $var2

il n'y a rien en sortie, tandis que :

#!/bin/sh
echo 'hello world' > test.file
read var1 var2 < test.file
echo $var1
echo $var2

produit la sortie attendue :

hello
world

Le tube ne devrait-il pas faire en une seule étape ce que la redirection vers test.file a fait dans le deuxième exemple ? J'ai essayé le même code avec les shells dash et bash et j'ai obtenu le même comportement des deux.

请先 登录 后评论

2 réponses

Mark Harrison

C'est parce que la version du tube crée un sous-shell, qui lit la variable dans son espace local qui est ensuite détruit lorsque le sous-shell se termine.

Exécutez cette commande

$ echo $$;cat | read a
10637

et utilisez pstree -p pour regarder les processus en cours d'exécution, vous verrez un shell supplémentaire suspendu à votre shell principal.

    |                       |-bash(10637)-+-bash(10786)
    |                       |             `-cat(10785)
请先 登录 后评论
Community

Le message a été correctement répondu, mais je voudrais proposer une autre doublure qui pourrait peut-être être utile.

Pour attribuer des valeurs séparées par des espaces depuis echo (ou stdout d'ailleurs) aux variables shell, vous pouvez envisager d'utiliser des tableaux shell :

$ var=( $( echo 'hello world' ) )
$ echo ${var[0]}
hello
$ echo ${var[1]}
world

Dans cet exemple, var est un tableau et le contenu est accessible à l'aide de la construction ${var[index]}, où index est l'index du tableau (commence par 0).

De cette façon, vous pouvez affecter autant de paramètres que vous le souhaitez à l'index de tableau pertinent.

请先 登录 后评论