
나는 다음 bash 스크립트를 작성했습니다.
if [ $(tmux has -t junk) ]
then
echo zero
else
echo one
fi
세션이 존재하는지 여부에 관계없이 항상 하나를 반환합니다. tmux 문을 실행한 다음 $?를 실행하여 명령줄에서 확인했습니다. . 예상대로 작동합니다. 세션이 존재하면 0이고 세션이 존재하지 않으면 1입니다. if 문이 동일한 방식으로 작동하지 않는 이유는 무엇입니까? 아래와 같이 if 문을 변경해 보았습니다.
tmux has -t junk
if [ $? -eq 0 ]
then
echo zero
else
echo one
fi
위의 내용이 작동합니다. 그렇다면 첫 번째 명령문 블록에 무슨 문제가 있는 걸까요?
답변1
언급한 대로 if [ $(tmux has -t junk) ]
확장하면 if [ ]
false로 평가됩니다.
다음을 사용할 수 있습니다.
if tmux has -t junk; then
echo OK
else
echo ERR
fi
또는 더 짧은 내용을 원하는 경우:
tmux has -t junk || echo ERR
또는
tmux has -t junk && echo OK || echo ERR
다음과 같이 더 적합한 경우 이를 부정할 수도 있습니다.
! tmux has -t junk || echo OK
! tmux has -t junk && echo ERR || echo OK
etc.
편집하다:
또한 명령이 출력을 생성하는 경우 다음과 같이 해당 출력을 블랙홀로 리디렉션할 수도 있습니다 /dev/null
.
if my_cmd >/dev/null; then echo OK else; echo ERR; fi
명령에서 텍스트 오류가 발생하면 다음을 통해 표준 오류도 리디렉션할 수 있습니다.
if my_cmd >/dev/null 2>&1; then echo OK else; echo ERR; fi
다음 내용은 이미 잘 알고 있을 수도 있지만 좀 더 완전성을 위해 추가합니다.
언급한 대로: $?
프로그램의 반환 값을 얻는 유일한 방법입니다.
일부 프로그램은 반환 값이 다양하며 다소 명시적인 의미를 가질 수 있습니다.
예를 들면:
mycmd
ecode=$?
case "$ecode" in
0) echo "Success";;
1) echo "Operation not permitted";;
2) echo "No such file or directory";;
esac
이를 통해 특정 오류에 대해 적절한 조치를 취할 수 있습니다.
MySQL이 설치되어 있다면 다음과 같이 할 수 있습니다.테러:
for i in {0..50}; do perror $i; done
# And
for i in {1000..1050}; do perror $i; done
그것에 대한 느낌을 얻으려면.
또한보십시오이 답변Open Groups 문서에도 연결되는 OS 특정 오류와 관련됨오류 번호그리고오류 번호.h.
답변2
당신이 사용할 때:
if [ $(tmux has -t junk) ]
이는 명령의 출력을 확인 tmux has -t junk
하지만 반환 값은 확인하지 않습니다.
따라서 첫 번째 경우처럼 항상 인쇄하므로 이는 tmux has -t junk
명령이 표준 출력에 아무 것도 인쇄하지 않는다는 것을 의미합니다.
그래서 첫 번째 경우에는,
if [ $(tmux has -t junk) ]
으로 평가받고 있다
if [ ]