Saya telah menyalurkan baris dalam skrip bash dan ingin memeriksa apakah pipa tersebut memiliki data, sebelum memasukkannya ke sebuah program.
Pencarian saya menemukan tentang test -t 0
tapi itu tidak bekerja di sini. Selalu mengembalikan false.
Jadi bagaimana memastikan bahwa pipa memiliki data?
Contoh:
echo "string" | [ -t 0 ] && echo "empty" || echo "fill"
Output:fill
echo "string" | tail -n+2 | [ -t 0 ] && echo "empty" || echo "fill"
Output:fill
Tidak seperti cara Standar/kanonik untuk menguji apakah pipa sebelumnya menghasilkan keluaran? input perlu dipertahankan untuk meneruskannya ke program. Ini menggeneralisasi Bagaimana menyalurkan output dari satu proses ke proses lain tetapi hanya mengeksekusi jika yang pertama memiliki output? yang berfokus pada pengiriman email.
Jawaban yang Diterima:
Tidak ada cara untuk mengintip isi pipa menggunakan utilitas shell yang tersedia secara umum, juga tidak ada cara untuk membaca karakter dari pipa lalu memasangnya kembali. Satu-satunya cara untuk mengetahui bahwa sebuah pipa memiliki data adalah dengan membaca satu byte, lalu Anda harus membawa byte tersebut ke tujuannya.
Jadi lakukan saja:baca satu byte; jika Anda mendeteksi akhir file, lakukan apa yang ingin Anda lakukan saat input kosong; jika Anda membaca satu byte, maka fork apa yang ingin Anda lakukan saat input tidak kosong, masukkan byte itu ke dalamnya, dan pipa sisa data.
first_byte=$(dd bs=1 count=1 2>/dev/null | od -t o1 -A n | tr -dc 0-9)
if [ -z "$first_byte" ]; then
# stuff to do if the input is empty
else
{
printf "\$first_byte"
cat
} | {
# stuff to do if the input is not empty
}
fi
ifne
utilitas dari moreutils Joey Hess menjalankan perintah jika inputnya tidak kosong. Biasanya tidak diinstal secara default, tetapi harus tersedia atau mudah dibuat di sebagian besar varian unix. Jika input kosong, ifne
tidak melakukan apa pun dan mengembalikan status 0, yang tidak dapat dibedakan dari perintah yang berhasil dijalankan. Jika Anda ingin melakukan sesuatu jika inputnya kosong, Anda perlu mengatur agar perintah tidak mengembalikan 0, yang dapat dilakukan dengan membuat kasus sukses mengembalikan status kesalahan yang dapat dibedakan:
ifne sh -c 'do_stuff_with_input && exit 255'
case $? in
0) echo empty;;
255) echo success;;
*) echo failure;;
esac
test -t 0
tidak ada hubungannya dengan ini; itu menguji apakah input standar adalah terminal. Itu tidak mengatakan apa pun tentang apakah ada input yang tersedia.