Daha önce, yanıt şu anda ilk bölüm olan son bölüm olarak sunuluyordu.
POSIX Kabuğu bir !
operatör içerir
Diğer sorunlar için kabuk özelliklerini araştırırken, geçenlerde (Eylül 2015) POSIX kabuğunun bir !
operatörü desteklediğini fark ettim . Örneğin, ayrılmış bir sözcük olarak listelenir ve bir boru hattının başlangıcında görünebilir - burada basit bir komut özel bir 'boru hattı' durumudur. Bu nedenle POSIX uyumlu kabuklarda if
deyimlerde ve / while
veya until
döngülerde de kullanılabilir . Sonuç olarak, çekincelerime rağmen, muhtemelen 2008'de fark ettiğimden daha yaygın olarak mevcut. POSIX 2004 ve SUS / POSIX 1997'nin hızlı bir kontrolü, !
her iki sürümde de mevcut olduğunu gösteriyor .
O Not !
operatörü de yer almalıdır başından boru hattının ve tüm boru hattının durum kodunu (yani olumsuzlar son komutu). İşte bazı örnekler.
$ ! 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
Taşınabilir cevap - antika kabuklarla çalışır
Bir Bourne (Korn, POSIX, Bash) komut dosyasında şunları kullanıyorum:
if ...command and arguments...
then : it succeeded
else : it failed
fi
Bu olabildiğince taşınabilir. 'Komut ve argümanlar' bir ardışık düzen veya başka bir bileşik komut dizisi olabilir.
Bir not
komut
'!' Operatör, ister kabuğunuzda yerleşik olsun ister o / s tarafından sağlanan, evrensel olarak mevcut değildir. Yine de yazmak çok zor değil - aşağıdaki kodun geçmişi en az 1991 yılına dayanıyor (yine de bir önceki sürümü daha uzun süre önce yazdığımı düşünüyorum). Yine de bunu komut dosyalarımda kullanma eğiliminde değilim çünkü güvenilir bir şekilde mevcut değil.
/*
@(
@(
@(
@(
@(
@(
*/
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);
}
Bu, komutu yürütemediğinde başarısızlığın tersi olan 'başarı'yı döndürür. 'Hiçbir şeyi başarılı bir şekilde yapma' seçeneğinin doğru olup olmadığını tartışabiliriz; belki de herhangi bir şey yapması istenmediğinde bir hata bildirmesi gerekir. ' "stderr.h"
' İçindeki kod basit hata raporlama olanakları sağlar - her yerde kullanırım. Talep üzerine kaynak kodu - benimle iletişime geçmek için profil sayfama bakın.