(1 jawaban)
Tutup 4 tahun yang lalu.
Saya punya dua skrip:
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
Dan sekarang saya menjalankannya
$ ./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
Keluaran dari bar.sh
mengejutkan bagi saya. Saya berharap itu sama untuk kedua skrip.
Mengapa keluaran foo.sh
dan bar.sh
berbeda? Apakah itu bug atau fitur?
Catatan
Berikut ini berfungsi seperti yang saya harapkan, yaitu output dari ini sama dengan output foo.sh
:
#!/bin/bash
for line in `echo -e "onentwo"`; do
ssh [email protected] 'cat not-existing'
echo hello $line
done
Mengapa?
Jawaban yang Diterima:
Di bar.sh
, two
dikonsumsi oleh ssh
. Pada contoh terakhir, output lengkap dari echo
digunakan oleh for
sebelum mulai mengulang.
Untuk menghindari ssh
melahap data Anda dari input standar, gunakan ssh -n
. Ini akan menghubungkan input standar ssh
dengan /dev/null
daripada dengan input standar while
lingkaran.
Ini akan melakukan apa yang Anda harapkan:
#!/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
Jika Anda telah menulis
#!/bin/bash
echo -e "onentwo" |
while read line; do
ssh [email protected] 'cat'
echo hello $line
done
lalu cat
pada mesin jarak jauh akan menghasilkan two
karena input standarnya diturunkan dari ssh
yang pada gilirannya mendapatkannya dari loop dan echo
. Ini akan mencetak two
daripada one
karena baris pertama input sudah dikonsumsi oleh read
.