J'ai un script bash qui est quelque chose comme suivre,
cat filename | while read line
do
read input;
echo $input;
done
mais cela ne me donne clairement pas la bonne sortie car lorsque je lis dans la boucle while, il essaie de lire à partir du nom de fichier du fichier en raison de la redirection d'E / S possible.
Une autre façon de faire de même?
bash
while-loop
w2lame
la source
la source
Réponses:
Lire à partir du terminal de contrôle:
plus d'infos: http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
la source
bash yourscript < /foo/bar
attendra l'entrée de l'utilisateur, cela n'est acceptable que lors de la lecture des mots de passe. La réponse de @GordonDavisson est préférable pour toutes les autres utilisations.Vous pouvez rediriger le stdin normal via l'unité 3 pour le conserver dans le pipeline:
BTW, si vous utilisez vraiment de
cat
cette façon, remplacez-le par une redirection et les choses deviennent encore plus faciles:Ou, vous pouvez permuter stdin et unité 3 dans cette version - lisez le fichier avec l'unité 3, et laissez simplement stdin seul:
la source
read line
lecture à partir de la notification est terminée, mais si vous l'exécutez simplement comme écrit, laread -u 3 input
lecture à partir de la console)?Il semble que vous ayez lu deux fois, la lecture à l'intérieur de la boucle while n'est pas nécessaire. De plus, vous n'avez pas besoin d'appeler la commande cat:
la source
read
comportement de l'intérieur comme "pas juste [parce que] il essaie de lire à partir du fichierfilename
") et de leur réponse acceptée.Essayez de changer la boucle comme ceci:
Test de l'unité:
la source
J'ai trouvé ce paramètre -u avec read.
"-u 1" signifie "lire depuis stdin"
la source
la source