Saya akan melakukan:
if not eof(stdin):
pass stdin to program
else:
do nothing
Saya merasa itu dapat ditulis cukup dekat dengan:
if test ! --is-eof - ; then
exec program
Masalah yang saya coba selesaikan adalah program
membaca dari stdin tetapi macet jika tidak mendapat input. Saya tidak memiliki akses ke sumber karena program
itu program
tidak dapat diubah. Input biner lebih besar dari ukuran memori sehingga menempatkan stdin ke file lebih dulu sangat lambat. Memproses semua input line-by-line di bash juga sangat lambat.
Solusinya idealnya bekerja di bawah csh dan bash.
Jawaban:
Coba baca satu baris dari stdin dulu:
sumber
if IFS= read -r line; then …
. Atau, jika inputnya berupa saluran yang tidak lengkap (mis.,echo "The quick brown fox jumps …\c" | OleTange.sh
)if IFS= read -r line || [[ -n "$line" ]]; then …
.read
untuk membaca sejumlah byte (termasuk \ 0) alih-alih satu baris penuh?read -N 1
tampaknya membantu, tetapi gagal jika karakter pertama adalah \ 0.Ini tampaknya bekerja di csh dan bash dan menangani dengan baik dengan input biner (juga \ 0 sebagai karakter pertama):
Terima kasih kepada @ glenn-jackman untuk memberikan gagasan membaca sedikit sebelum melewati ini dan sisa stdin
cat
.sumber
Masukan apa yang diharapkan oleh program Anda? apakah Anda menyalurkan output dari satu program ke yang lain atau apakah itu membaca file?
Jika Anda menggunakan pengalihan pipa untuk mengumpulkan input ke skrip Anda, maka itu akan melanjutkan eksekusi sampai pasokan input disediakan.
jika Anda mencoba membaca dari suatu file maka gunakan "sementara" atau "sampai" untuk melakukan pekerjaan itu.
sumber
Saya posting di sini karena ini datang ketika mencari dan karena itu membantu saya debug pada Darwin (snow leopard) pesta di
set -x;trap 'test -s /dev/stdin||exit' debug
untuk menemukan panggilan yang mengkonsumsi masukan mewarisi dari script orang tua.Untuk yang lemah hati:
Uji:
Tes di atas menghasilkan yang berikut dalam versi dan sistem bash saya.
pass 4 2 45 2 release i386-apple-darwin10.8.0
pass 3 2 48 1 release x86_64-apple-darwin10.0
fail 4 2 37 1 release x86_64-pc-linux-gnu
Menyambungkan ke
cat /proc/self/fdinfo/0
Debian saya (mengi) tidak memberikan apa pun untuk diuji.Ceria atau lebih tepatnya cheerEO untuk Kesalahan / Keluaran%)
sumber
Jika Anda tidak ingin skrip Anda diblokir dalam upaya mencari sesuatu untuk dibaca, Anda dapat (setidaknya dalam bash) menggunakan pembacaan dengan batas waktu
Namun ini tidak menjamin bahwa Anda memiliki EOF tetapi tidak ada yang dapat dibaca saat ini
sumber