Menggunakan loop sementara untuk membaca file, secara acak berhenti membaca file di tengah [ditutup]

1

Saya memiliki bagian kecil kode yang membaca file, $ FUNCTION_FILE yang berisi daftar nama fungsi dalam format:

func1
func2
func3

Ini akan membaca baris, menjalankan fungsinya, dan ulangi sampai file selesai. Berikut ini cuplikannya:

while read line; do
    LINE_NUMBER=`expr $LINE_NUMBER + 1`
    echo "LINE_NUMBER=$LINE_NUMBER"

    $func
done <$FUNCTION_FILE

Saya mengalami situasi di mana kadang-kadang bagian kode ini akan berhenti membaca "$ FUNCTION_FILE" sebelum menyelesaikan dan melanjutkan dengan sisa skrip. Kadang-kadang itu hanya akan membaca baris pertama dan melewatkan sisanya, kadang-kadang hanya baris kedua; Saya tidak pernah melihat pesan "LINE_NUMBER = $ LINE_NUMBER" untuk baris berikutnya juga.

Dengan asumsi file tersebut benar, apa saja hal-hal yang dapat menyebabkan masalah ini yang saya lihat?

suara bising
sumber
Apakah ada baris yang berisi exit?
choroba
Anda meminta kami untuk men-debug kode arbitrer yang tidak dapat kami lihat? Apa pun bisa terjadi, itu tergantung pada apa adanya $func. Tolong tunjukkan kepada kami fungsi yang sebenarnya Anda jalankan, tidak ada cara kami dapat membantu sebaliknya.
terdon
Maaf karena begitu samar. Saya tidak dalam posisi untuk membocorkan salah satu kode aktual, saya kebanyakan mencoba mengumpulkan info tentang cara skrip dapat memanipulasi stdin (seperti jawaban pertama menyarankan). Terima kasih atas waktu Anda, saya sangat menghargainya.
noisesolo

Jawaban:

3

Apakah ada fungsi Anda yang membaca dari stdin (mis: readperintah)? Jika demikian, itu akan menghirup sisa FUNCTION_FILE.

Ubah loop sementara untuk menggunakan deskriptor file yang berbeda:

line_num=0
while read -u3 line; do
    echo "LINE_NUMBER=$(( ++line_num ))"
    $func
done 3<"$function_file"

Keluar dari kebiasaan menggunakan ALL_CAPS_VARIABLES - suatu hari nanti Anda akan secara tidak sengaja menggunakan "PATH" dan menghancurkan skrip Anda.

glenn jackman
sumber
Terima kasih atas sarannya, saya akan melihat lebih dalam dan melihat apakah ini masalahnya. Sayangnya, banyak konvensi adalah korban basis kode yang sangat tua dan besar, tetapi saya sangat menghargai saran Anda dan akan memastikan untuk menaatinya dalam upaya saya sendiri.
noisesolo