GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memeriksa apakah pipa kosong dan menjalankan perintah pada data jika tidak?

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.

Terkait:cara meratakan gambar .pdf dari baris perintah?
Linux
  1. Cara Membuat Alias ​​​​dan Menggunakan Perintah Alias ​​​​di Linux

  2. Cara Menulis dan Menjalankan Program Qt pertama Anda di Debian 10

  3. Cara mengecek OS dan versi menggunakan perintah Linux

  1. Cara memeriksa Versi OS dan Linux

  2. Cara Menginstal dan Menggunakan Perintah Ping di Linux

  3. Bagaimana saya bisa menjalankan pemeriksaan nagios secara manual dari baris perintah?

  1. Bagaimana cara mem-pipe ke perintah split Linux?

  2. Bagaimana opsi '-s', '-t', dan '-c' dari perintah tr bekerja di Unix?

  3. Bagaimana cara menjalankan perintah Vim dari shell?