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