이전에는 마지막 섹션으로 현재 첫 번째 섹션이 무엇인지 대답이 제시되었습니다.
POSIX Shell에는 !
연산자가 포함되어 있습니다.
다른 문제에 대한 셸 사양을 살펴보면서 최근 (2015 년 9 월) POSIX 셸이 !
연산자를 지원한다는 것을 알았습니다 . 예를 들어, 예약어 로 나열되고 파이프 라인 의 시작 부분에 나타날 수 있습니다. 여기서 간단한 명령은 'pipeline'의 특별한 경우입니다. 따라서 POSIX 호환 셸 에서 if
문 및 while
/ 또는 until
루프에서도 사용할 수 있습니다 . 결과적으로 내 예약에도 불구하고 2008 년에 깨달은 것보다 더 널리 사용 가능할 것입니다. POSIX 2004 및 SUS / POSIX 1997을 빠르게 확인하면 !
두 버전 모두에 존재 하는 것으로 나타났습니다 .
점을 유의 !
운영자가에 나타나야 시작 파이프 라인의 전체 파이프 라인의 상태 코드 (즉, 부정 마지막 명령). 여기 예시들이 있습니다.
$ ! 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
휴대용 대답-골동품 조개와 함께 작동
Bourne (Korn, POSIX, Bash) 스크립트에서 다음을 사용합니다.
if ...command and arguments...
then : it succeeded
else : it failed
fi
이것은 휴대 성이 뛰어납니다. '명령 및 인수'는 파이프 라인 또는 기타 복합 명령 시퀀스 일 수 있습니다.
not
명령
'!' 연산자는 쉘에 내장되어 있든 운영 체제에서 제공하든 보편적으로 사용할 수 없습니다. 하지만 작성하기가 끔찍하게 어렵지는 않습니다. 아래 코드는 최소한 1991 년으로 거슬러 올라갑니다 (나는 이전 버전을 더 오래 전에 작성했다고 생각하지만). 나는 안정적으로 사용할 수 없기 때문에 스크립트에서 이것을 사용하지 않는 경향이 있습니다.
/*
@(
@(
@(
@(
@(
@(
*/
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);
}
명령 실행에 실패하면 실패의 반대 인 '성공'을 반환합니다. 우리는 '아무것도 성공적으로하지 않음'옵션이 옳았는지 토론 할 수 있습니다. 아무것도 요청하지 않으면 오류를보고해야 할 수도 있습니다. ' "stderr.h"
' 의 코드 는 간단한 오류보고 기능을 제공합니다. 저는 모든 곳에서 사용합니다. 요청시 소스 코드-저에게 연락하려면 내 프로필 페이지를 참조하십시오.