Ketika saya mencoba mengeksekusi mail
dari dalam suatu fungsi dalam skrip bash, ia menciptakan sesuatu yang mirip dengan bom fork. Untuk memperjelas, ini menciptakan masalah:
#!/bin/bash
mail() {
echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]"
}
mail
exit 0
Kadang-kadang Anda hanya bisa membunuh perintah dan itu akan membunuh proses anak, tetapi kadang-kadang Anda harus melakukannya killall -9
.
Tidak peduli apakah surat itu dikirim atau tidak. The bom garpu dibuat dengan cara baik. Dan sepertinya tidak menambahkan cek untuk kode keluar, seperti if ! [ "$?" = 0 ]
, membantu.
Tetapi skrip di bawah ini berfungsi sebagaimana dimaksud, baik itu menghasilkan kesalahan atau mengirim surat.
#!/bin/bash
echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]"
exit 0
Mengapa ini terjadi? Dan bagaimana Anda akan memeriksa kode keluar dari perintah email?
bash
shell-script
mail-command
roxto
sumber
sumber
Jawaban:
Anda memohon fungsi
mail
dari dalam fungsi yang sama:Ini seharusnya bekerja:
Perhatikan bahwa nama fungsi tidak lagi dipanggil dari dalam fungsi itu sendiri.
sumber
Jika tidak:
... harus bekerja dengan baik.
sumber
command
bagian itu, seperti untuk orang awam, sulit untuk memperhatikan bahwa perubahan seiring denganolly olly oxenfree
dan'and the rest' and@more
perubahan, terutama dengan penyorotan sintaksis.Solusi paling "tradisional" dalam kasus ini adalah dengan memanggil perintah dengan path lengkap:
Semua jawaban lain berfungsi, dan mungkin lebih portabel, tetapi saya pikir ini adalah solusi yang paling mungkin Anda temukan dalam skrip di dunia nyata yang liar, jadi saya memasukkannya untuk kelengkapan.
sumber
/bin/mail
. Saya pikir ini membuktikan nilaicommand mail
sintaks./usr
karena paradigma mereka adalah untuk memindahkan semua binari ke direktori yang sama, jadi/bin
hanya sebuah symlink ke/usr/bin
. Jadi ya ... ini tidak portabel, tetapi lebih umum dilihat daripadacommand
, entah bagaimana - terutama dalam skrip boot lawas yang dibuat khusus untuk setiap distribusi, semua jalur absolut di-hardcode (skrip rc di Slackware, misalnya).