Sebelumnya, jawabannya disajikan dengan apa yang sekarang menjadi bagian pertama sebagai bagian terakhir.
POSIX Shell menyertakan !
operator
Mengaduk-aduk spesifikasi shell untuk masalah lain, saya baru-baru ini (September 2015) memperhatikan bahwa shell POSIX mendukung !
operator. Misalnya, ini terdaftar sebagai kata yang dipesan dan dapat muncul di awal pipeline - di mana perintah sederhana adalah kasus khusus 'pipeline'. Oleh karena itu, dapat digunakan dalam if
pernyataan dan while
atau until
loop juga - dalam shell yang sesuai dengan POSIX. Akibatnya, meskipun saya ragu, ini mungkin lebih banyak tersedia daripada yang saya sadari pada tahun 2008. Pemeriksaan cepat dari POSIX 2004 dan SUS / POSIX 1997 menunjukkan bahwa !
ada di kedua versi tersebut.
Perhatikan bahwa !
operator harus muncul di awal pipeline dan meniadakan kode status dari seluruh pipeline (yaitu perintah terakhir ). Berikut ini beberapa contohnya.
$ ! some-command succeed; echo $?
1
$ ! some-command fail | some-other-command fail; echo $?
0
$ ! some-command < succeed.txt; echo $?
1
$ ! RESULT=fail some-command; echo $?
0
$ if ! some-command < input.txt | grep Success > /dev/null; then echo 'Failure!'; recover-command; mv input.txt input-failed.txt; fi
Failure!
$ ls *.txt
input-failed.txt
Jawaban portabel - bekerja dengan cangkang antik
Dalam skrip Bourne (Korn, POSIX, Bash), saya menggunakan:
if ...command and arguments...
then : it succeeded
else : it failed
fi
Ini portabel. 'Perintah dan argumen' dapat berupa pipa atau rangkaian perintah gabungan lainnya.
Sebuah not
perintah
'!' operator, apakah built-in ke shell Anda atau disediakan oleh o / s, tidak tersedia secara universal. Tidak terlalu sulit untuk menulis, meskipun - kode di bawah ini berasal dari setidaknya tahun 1991 (meskipun saya pikir saya menulis versi sebelumnya lebih lama lagi). Saya tidak cenderung menggunakan ini dalam skrip saya, karena tidak tersedia secara andal.
/*
@(
@(
@(
@(
@(
@(
*/
static const char sccs[] = "@(#)$Id: not.c,v 4.2 2005/06/22 19:44:07 jleffler Exp $";
int main(int argc, char **argv)
{
int pid;
int corpse;
int status;
err_setarg0(argv[0]);
if (argc <= 1)
{
/* Nothing to execute. Nothing executed successfully. */
/* Inverted exit condition is non-zero */
exit(1);
}
if ((pid = fork()) < 0)
err_syserr("failed to fork\n");
if (pid == 0)
{
/* Child: execute command using PATH etc. */
execvp(argv[1], &argv[1]);
err_syserr("failed to execute command %s\n", argv[1]);
/* NOTREACHED */
}
/* Parent */
while ((corpse = wait(&status)) > 0)
{
if (corpse == pid)
{
/* Status contains exit status of child. */
/* If exit status of child is zero, it succeeded, and we should
exit with a non-zero status */
/* If exit status of child is non-zero, if failed and we should
exit with zero status */
exit(status == 0);
/* NOTREACHED */
}
}
/* Failed to receive notification of child's death -- assume it failed */
return (0);
}
Ini mengembalikan 'sukses', kebalikan dari kegagalan, ketika gagal menjalankan perintah. Kita dapat memperdebatkan apakah opsi 'tidak berhasil' itu benar; mungkin itu harus melaporkan kesalahan ketika tidak diminta untuk melakukan apapun. Kode dalam ' "stderr.h"
' menyediakan fasilitas pelaporan kesalahan sederhana - saya menggunakannya di mana-mana. Kode sumber atas permintaan - lihat halaman profil saya untuk menghubungi saya.