(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 .