Bagaimana saya bisa menulis ulang perintah ini hanya untuk email jika ada output dari mailq | grep
?
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email
Apakah ini mungkin dilakukan dalam satu baris?
Lihat Periksa apakah pipa kosong dan jalankan perintah pada data jika itu bukan untuk kasus yang lebih umum daripada mengirim email.
Jawaban:
Saya pikir Anda harus menggunakan file temp untuk operasi ini sehingga Anda dapat menggunakan
&&
operator untuk hanya menjalankan perintah mail jika grep mengembalikan status keluar yang mengatakan itu cocok dengan ini:Jika Anda tidak keberatan file temp menempel di suatu tempat dan dapat menggunakan nama statis untuk itu, Anda bisa melewatkan hal-hal penamaan dan penghapusan khusus:
Sunting: Setelah melihat jawaban glenn saya bermain dengan ini lagi dan tampaknya menetapkan variabel menggunakan
$()
sintaks mengembalikan kode keluar dari perintah, sehingga Anda dapat melewati tes yang digunakannya untuk panjang string dan menggunakannya sebagai gantinya. Ini dia semua dalam satu perintah:Sunting 2: Setelah melihat jawaban Simon, saya memeriksa
mail
program saya . Itu tidak berperilaku seperti yang ia gambarkan secara default, tetapi memang memiliki opsi untuk itu. Dari halaman manual:Memungkinkan ini:
sumber
mktemp
tidak akan mengembalikan sesuatu yang perlu dikutip.glob(split(var))
. Anda tidak perlu pemisahan kata atau mengajukan ekspansi glob di sini, jadi jangan tanya mereka. Kami juga harus menunjukkan cara yang benar di situs ini .zsh
dan saya sebenarnya tidak mendapatkan globbing atau pemisahan kata dalam kasus-kasus seperti ini kecuali saya memintanya, tetapi demi jawaban di sini dan tidak mengetahui lingkungan target yang mengutip dari prinsip itu baik-baik saja.Program utilitas ifne ada secara tegas untuk tujuan ini: untuk menjalankan perintah jika input standar tidak kosong.
Perintah ifne adalah bagian dari paket moreutils , disebut sebagai "kumpulan alat Unix yang terus berkembang yang tak seorang pun berpikir untuk menulis sejak lama, ketika Unix masih muda."
sumber
Anda bisa menyimpan output dalam variabel, dan kemudian memanggil perintah mail jika panjang string tidak nol.
Untuk satu baris, gabungkan dua perintah dengan titik koma.
sumber
Gunakan
mail
dengan-E
opsi. Di Mac saya, MAIL (1) mengatakan-E
bendera tidak akan mengirim email dengan badan kosong.Di Mac saya, saya menjalankan tes berikut. Perhatikan bahwa file itu
file_does_exist
memang ada, tetapi filefile_does__not_exist
itu tidak ada.Ini mengirim email kepada saya:
Ini tidak. Perhatikan bahwa perintah
ls file_does_not_exist | egrep ...
tidak menghasilkan output apa pun.sumber
Dalam kasus khusus ini, jika Anda
mail
mendukung-E
opsi , gunakan saja. Dalam kasus umum, Anda dapat mencoba membaca satu karakter; jika ada, mulai perintah postprocessing dan berikan karakter itu dari sisa file.Perhatikan penggunaan yang bermanfaat dari
cat
. Penambahan dariecho .
membuat fungsi ini bekerja bahkan jika karakter pertama dalam input adalah baris baru (ingat bahwa$(…)
strip terminal membangun baris baru).Dengan sebagian besar shell (apa pun selain zsh, sejauh yang saya tahu), jika file dimulai dengan karakter nol, kode ini akan percaya itu kosong. Memperbaiki yang tersisa sebagai latihan untuk pembaca. (Petunjuk: gunakan
od
di subshell pertama danprintf
untuk mencetak byte pertama.) (Solusi: Cara memeriksa apakah pipa kosong ) Anda mungkin mengalami masalah yang sama jika file dimulai dengan byte yang bukan karakter yang valid pada saat ini lokal; itu lebih mudah diperbaiki dengan menjalankan kode iniLC_ALL=C
.sumber
read
bantuan menyederhanakan ini?read
di sh portabel (mungkin dimungkinkan dalam bash, ksh atau zsh).IIRC
mail
perintah BSD dibatalkan jika diberi pesan kosong.sumber
-E
pilihan untuk mengaktifkannya .Baru-baru ini saya telah belajar tentang nama perintah
ifne
yang merupakan bagian darimoreutils
paket. Di mana Anda dapat menggunakannya untuk memecahkan masalah khusus ini.contoh dari halaman manual,
sumber
Anda bisa menulis ulang perintah Anda menggunakan
test -s /dev/stdin
untuk memeriksa apakah ada output darimailq | grep
bagian tersebut.sumber