터미널 명령의“bad”(0 아님) 리턴 코드를 강제로 적용 하시겠습니까?


8

나는 파이썬으로 작성된 프레임 워크를 가지고 있으며 테스트 목적으로 기본적으로 서브 프로세스 (일명 쉘 호출)를 원합니다 ... RC와 함께 돌아와야합니다! = 0. 존재하지 않는 실행 파일을 호출하려고했습니다. 또는 "종료 1"을 실행하거나; 그러나 어떤 이유로 FileNotFoundError로 변환되었습니다.

따라서 리턴 코드! = 0 ( "신뢰할 수있는"방식으로 트리거하기 위해 수행 할 수있는 다른 작업 : 명령은 미래 시점에서 갑자기 0을 반환해서는 안 됨)을 의미합니다.

exit라는 바이너리를 "검색"할 것으로 생각했지만

> /usr/bin/env exit
/usr/bin/env: exit: No such file or directory

1
exit 1미래를 보장하는 방법입니다. FileNotFoundError는 다른 원인으로 인해 발생해야합니다.
Jos

내가 "종료"할 때 ... 아무것도 발견되지 않습니다. 따라서 "exit"는 bash 함수라고 가정합니다. 하위 프로세스 호출을 할 때 아마도 사용할 수 없습니까?!
GhostCat

기술적 인 nitpicking : 0이 아닌 리턴 코드는 귀하의 질문이 암시하는 것처럼 나쁜 상황을 나타내는 것으로 의도되지 않았습니다 . "0"은 "아무것도 없음"을 의미하는 것은 단지 관습의 문제입니다. 실제로 호출 프로세스로 다시 전달할 8 비트 정보가 있습니다.
Jos

@Jos 나는 그것을 이해한다. 그러나 요점은 RC! = 0이 subprocess.check_call ()의 특정 예외로 이어진다는 것입니다. 해당 조건을 올바르게 처리하여 실제 테스트의 RC! = 0 상황이 올바르게 처리되도록하십시오.
GhostCat

2
어때요 /bin/false?
스틸 드라이버

답변:


18

항상 0이 아닌 종료 코드를 반환 하는 시스템 명령을 찾고 있다면 /bin/false그것이 효과가있는 것처럼 보입니다. 보낸 사람 man false:

NAME
       false - do nothing, unsuccessfully

SYNOPSIS
       false [ignored command line arguments]
       false OPTION

DESCRIPTION
       Exit with a status code indicating failure.

아니 그렇지 않아. 적어도 bash를 실행하는 Ubuntu 16.04.4에서 다음 명령 줄은 5 대신 1을 제공합니다./bin/false 5; echo $?
fviktor

@fviktor 그것은 0이 아닌 상태로 빠져 나옵니다 -시놉시스가 말했듯이 명령 줄 인수 (예 5
:)

네가 옳아. 실제 0이 아닌 종료 코드를 제어 할 방법이 없습니다.
fviktor

7

bash -c "exit RETURNCODE""RETURNCODE"를 임의의 숫자로 바꾸고 명령으로 새 리턴 코드를 작성할 수 있습니다 . (RETURNCODE mod 256)에 의해 8 비트 부호없는 정수 (0 ... 255)로 잘립니다.

실행 하여 터미널 (!) 내부의 마지막 쉘 명령의 리턴 코드를 확인할 수 있습니다 echo $?. "$?" variable은 최신 리턴 코드를 포함하고 "echo"는 표준 출력으로 인쇄합니다.


+1. 쉘 스크립트로 이것을 작성한다면, exit RETURNCODE( bash -c부분 없이 )
Matt Browne

0

좀 더 테스트 한 결과, 제 문제는 "리눅스"쪽이 아니라는 것을 알았습니다.

파이썬에는 모듈 shlex가 있습니다. 명령 문자열을 "분할"하는 데 사용해야합니다. shlex.split()"bash exit 1" 을 호출 한 결과를 사용하도록 서브 프로세스 호출을 변경하면 필요한 정보가 제공됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.