이 간단한 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
이러한 혼란을 방지하려면 실행 결과를 다른 변수에 저장하는 것이 좋습니다.