유닉스의 테스트 명령이 출력을 인쇄하지 않습니다


20

터미널에 이것을 입력하면

test 4 -lt 6

출력이 없습니다. 왜 안돼? 0 또는 1이 필요합니다


1
'test'에 값을 즉시 출력하는 옵션이 있다면 좋지 않습니까? 그냥 옵션입니다. 그게 우리가 필요로하는 전부입니다.
Todd Walton

답변:


15

종료 코드에서 0 또는 1을 얻습니다.

bash-4.2$ test 4 -lt 6

bash-4.2$ echo $?
0

bash-4.2$ test 4 -gt 6

bash-4.2$ echo $?
1

업데이트 : 나중에 사용하기 위해 종료 코드를 저장하려면 변수에 할당하십시오.

bash-4.2$ test 4 -lt 6

bash-4.2$ first=$?

bash-4.2$ test 4 -gt 6

bash-4.2$ second=$?

bash-4.2$ echo "first test gave $first and the second $second"
first test gave 0 and the second 1

1
종료 코드를 파이프하는 방법이 있습니까?
indieman

3
아니요. 출력 만 리디렉션 할 수 있습니다. 어쨌든, 보통은 그럴 필요가 없습니다. 나중에 사용하기 위해 저장하려면 변수에 지정하십시오. 또는 그 가치에 대한 귀하의 의도가 정확히 무엇인지 알려주십시오.
manatwork

2
종료 코드는 $?변수에 배치됩니다 ( 적어도 다음에 실행하는 명령으로 덮어 쓸 때까지).
Shadur

1
추신 : 배열 을 사용 하여$PIPESTATUS 파이프 라인에서 여러 명령의 결과를 얻을 수 있습니다 . $?으로의 결과 일 것이다 마지막 경우 파이프 라인의 명령 옵션을 해제 (기본값)입니다. pipefail
l0b0

@indieman, 종료 상태에 따라 다른 작업을 수행하는 것이 필요한 경우 저장하지 않아도됩니다.if test 4 -lt 6; then echo test succeeeded; else echo test failed; fi
Wildcard

5

다른 방법은

test 4 -lt 6 && echo 1 || echo 0

그러나이 경우주의하십시오. 만약 test반환 성공과 echo 1실패 echo 0실행됩니다.


2

종료 코드 대신 표준 출력에 대한 비교 결과를 원하는 경우 다음 expr(1)명령을 사용할 수 있습니다 .

$ expr 4 '<=' 6
1

두 가지주의 사항 :

  1. 쉘 메타 문자와 충돌하는 많은 연산자를 인용해야 할 것입니다.
  2. 출력값은에 대한 리턴 코드와 반대입니다 test. testtrue (종료 코드의 표준)에 대해서는 0을 반환하지만 exprtrue에 대해서는 1을 인쇄합니다.

1
3.이 test상당히 빠르게 이상 (약 50 내 컴퓨터에서 회)이다 쉘 내장, test그리고 expr로부터 실행 파일 로 coreutils 패키지.
manatwork

두 번째 포인트 +1 엉망이된다면 매우 실망스러운 버그가 생길 수 있습니다.
Emanuel Berg

2

다음 명령을 입력 할 수 있습니다.

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