Il semble que read
n'écrit pas sur la sortie standard.
$ cat test.sh #!/bin/bash read -p "tapez une clé et entrez" key echo "la clé était $ key" $ ./test.sh type une clé et Enterx la clé était x $ ./test.sh | fichier tee tapez une clé et Enterx la clé était x $ cat file la clé était x
Essayer sans script ...
$ read -p "tapez une clé et entrez" clé | fichier tee tapez une clé et Enterx $ fichier cat $
La commande read
est décrite ici . Une brève description: "Lire une ligne à partir d'une entrée standard".
Des informations sur le tuyau, |
, à partir de La ligne de commande Linux (2e édition Internet) par William E. Shotts sont ensuite présentées.
Utilisation de l'opérateur de canal "|" (barre verticale), la sortie standard d’une commande peut être canalisée vers l’entrée standard d’une autre:
command1 | command2
La page de manuel relative à tee
contient cette description:
lire depuis l'entrée standard et écrire dans la sortie standard et les fichiers
La page de manuel pour tee
est à ceci lien .
Où se trouve la liste de tous les autres exemples de programmes écrivant sur la console mais n'utilisant pas la sortie standard, ou en l'absence d'une telle liste, quelle est la règle générale pour savoir quand un programme qui écrit sur la console n'est pas en utilisant la sortie standard?
Il semble que read
viole le principe du moindre étonnement .
Dans votre exemple, read
écrit dans stderr au lieu de stdout. Voici comment je sais:
$ read -p "Tapez une clé et appuyez sur Entrée:" clé>/dev/null Tapez une clé et appuyez sur Entrée: x $ read -p "Entrez une clé et appuyez sur Entrée: "touche 2>/dev/null x
Vous pouvez effectuer ce test sur n’importe quel programme dont vous voulez rediriger la sortie.
La commande que vous recherchez est donc la suivante:
$ read -p "Tapez une clé et appuyez sur Entrée:" touche 2> & 1 | fichier tee Tapez une clé et appuyez sur Entrée: x $ fichier cat Tapez une clé et appuyez sur Entrée: $
Pour des explications sur les redirections ci-dessus:
Avec ce que wjandrea a dit, c’est exact que vous pouvez saisir la stderr
que la lecture fait. Malheureusement, essayer de lire avec la variable stderr
ne conserve pas la variable key
, de sorte que la sortie de echo $key
finira vide. Cependant, dans un script, la variable sera conservée car la ligne de lecture elle-même n'est pas redirigée de stderr
vers stdout
2>&1
dans le script. Au lieu de cela, le script doit conserver la variable car elle est maintenant définie avant la redirection. Je pense que pour faciliter les choses, utilisez plutôt les lignes echo
. J'ai ajouté tous les exemples.
Exemple de votre script:
:~$ cat test1.sh
#!/bin/bash
read -p "type a key and Enter: " key
echo "the key was $key"
:~$ ./test1.sh | tee junk
type a key and Enter: G
the key was G
:~$ cat junk
the key was G
Avec la redirection 2>&1
:
:~$ ./test1.sh 2>&1 | tee junk
type a key and Enter: G
the key was G
:~$ cat junk
type a key and Enter: the key was G
Avec la ligne echo
:
:~$ cat test.sh
#!/bin/bash
echo -n "Type a key and press Enter: "
read key
echo "the key was $key"
echo
ligne avec commande tee:
:~$ ./test.sh | tee junk
Type a key and press Enter: X
the key was X
:~$ cat junk
Type a key and press Enter: the key was X
Exemple de non script:
Avec stderr
:
:~$ read -p "Type a key and press Enter: " key 2>&1 |tee junk; echo "The key was $key" | tee -a junk
Type a key and press Enter: F
The key was
:~$ cat junk
Type a key and press Enter: The key was
Avec echo
et plusieurs commandes tee à la place:
:~$ echo -n "Type a key and press Enter: " | tee junk; read key; echo "The key was $key" | tee -a junk
Type a key and press Enter: F
The key was F
:~$ cat junk
Type a key and press Enter: The key was F
J'espère que cela t'aides!