web-dev-qa-db-fra.com

exemple de sortie de console qui n'est pas écrite sur la sortie standard

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 .

2
H2ONaCl

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:

6
wjandrea

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 stdout2>&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!

1
Terrance