(1 odpověď)
Uzavřeno před 4 lety.
Mám dva skripty:
foo.sh:
#!/bin/bash
echo -e "onentwo" |
while read line; do
cat not-existing
echo hello $line
done
bar.sh:
#!/bin/bash
echo -e "onentwo" |
while read line; do
ssh [email protected] 'cat not-existing' # Here is the only difference
echo hello $line
done
A teď je spouštím
$ ./foo.sh
cat: not-existing: No such file or directory
hello one
cat: not-existing: No such file or directory
hello two
$ ./bar.sh
cat: not-existing: No such file or directory
hello one
Výstup bar.sh
je pro mě překvapující. Očekával bych, že to bude stejné pro oba skripty.
Proč je výstup foo.sh
a bar.sh
lišit? Je to chyba nebo funkce?
Poznámka
Následující funguje, jak očekávám, tj. výstup tohoto je stejný jako výstup foo.sh
:
#!/bin/bash
for line in `echo -e "onentwo"`; do
ssh [email protected] 'cat not-existing'
echo hello $line
done
Proč?
Přijatá odpověď:
V bar.sh
, two
je spotřebován ssh
. V posledním příkladu je úplný výstup z echo
je používán for
než se začne opakovat.
Abyste se vyhnuli ssh
zhltněte svá data ze standardního vstupu, použijte ssh -n
. Tím se připojí standardní vstup ssh
pomocí /dev/null
spíše než se standardním vstupem while
smyčka.
To udělá to, co očekáváte:
#!/bin/bash
echo -e "onentwo" |
while read line; do
ssh -n [email protected] 'cat not-existing' # Here is the only difference
echo hello $line
done
Kdybys napsal
#!/bin/bash
echo -e "onentwo" |
while read line; do
ssh [email protected] 'cat'
echo hello $line
done
pak cat
na vzdáleném počítači by vyšly two
protože jeho standardní vstup je předán z ssh
který to zase dostal ze smyčky a echo
. Vypíše two
spíše než one
protože první řádek vstupu již byl spotřebován read
.