Bash IF 문이 예상대로 작동하지 않습니다.

Bash IF 문이 예상대로 작동하지 않습니다.

이 간단한 Bash 스크립트의 논리를 이해할 수 없습니다.

#!/bin/bash

# Check if file is present
which ./vendor/bin/non_existent_file &> /dev/null

printf "Exited with $?\n\n"

if [[ "$?" -eq 1 ]]; then
  echo "Number is One"
else
  echo "Number is not one"
fi

파일이 누락된 경우(존재하지 않는 경우) 출력은 다음과 같습니다.

Exited with 1

Number is not one

파일이 존재하는 경우 출력은 다음과 같습니다.

Exited with 0

Number is not one

???

내가 시도한 것들:

if [ $? == 1 ]
if [ "$?" == 1 ]
if [[ "$?" == 1 ]]
if [[ $? -eq 1 ]]
if [[ "$?" = "1" ]]
if [[ "$?" == "1" ]]

IF 문이 항상 실패하는 이유는 무엇입니까?

답변1

which ./vendor/bin/non_existent_file &> /dev/null

그러면 종료 상태가 실행 which되고 설정 됩니다. $?(나는 이것이 which지금 당신에게 효과가 있다고 가정합니다.)

printf "Exited with $?\n\n"

그러면 종료 상태가 실행 printf되고 설정 됩니다.$?

if [[ "$?" -eq 1 ]]; then

따라서 테스트되는 것은 종료 상태입니다 printf.

이를 방지하려면 종료 상태를 임시 변수에 저장해야 합니다.

which ./vendor/bin/non_existent_file &> /dev/null
ret=$?
printf 'which exited with status %d\n' "$ret"
if [[ $ret -ne 0 ]]; then
    printf "that was a falsy exit status"
fi

내가 아는 한 지정된 실행 파일이 which검색되지만 고정 경로를 보고 있는 경우 파일이 실행 가능한지 직접 확인하는 데 사용할 수 있습니다. 에서 프로그램을 찾고 있다면 확인해 보세요.PATH[[ -x ./path ]]PATH" which "를 사용하지 않는 이유는 무엇입니까? 그러면 무엇을 사용해야 합니까?경고 및 극단적인 경우.

답변2

의견을 주신 @Kusalananda와 @SottoVoce에게 감사드립니다.

$?를 포함하여 이전 명령의 결과를 저장합니다 printf.

따라서 실행 이 성공적으로 실행되었기 때문에 실행이 로 printf "Exited with $?\n\n"변경됩니다 .$?0

이러한 혼란을 방지하려면 실행 결과를 다른 변수에 저장하는 것이 좋습니다.

관련 정보