GNU/Linux >> Znalost Linux >  >> Linux

Neočekávané chování skriptu Shell?

Tato otázka zde již má odpověď :SSH způsobí zastavení smyčky while

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


Linux
  1. Ssh – Shell skript pro přihlášení na Ssh server?

  2. Časový limit ve skriptu Shell?

  3. Grep -v Neočekávané chování?

  1. Shell skript s funkcí a parametrem jako proměnnými?

  2. Neočekávané Eof při hledání shody „““ – Bash Script?

  3. Skript Shell visí na příkazu Mail?

  1. Odesílání HTML pošty pomocí shell skriptu

  2. Zkontrolujte konektivitu databáze pomocí skriptu Shell

  3. Odeslání pošty z linuxového shell skriptu