"if tty -s"는 작동하지만 "if [tty -s]"는 작동하지 않는 이유는 무엇입니까?

"if tty -s"는 작동하지만 "if [tty -s]"는 작동하지 않는 이유는 무엇입니까?

참고로 저는 kshCentOS를 사용하고 실행하고 있습니다.

다음과 같이 로거 기능이 설정된 쉘 스크립트가 있습니다.

if tty -s
then
  echo "${FOO}" | tee -a ${BAR_LOG_FILE}
else
  echo "${FOO}" >> ${BAR_LOG_FILE} 
fi

if내 문제는 코드의 다른 모든 테스트 처럼 보이도록 리팩터링하면 실행이 중지된다는 것입니다.if

왜?

내 리팩토링은 다음과 같습니다.

if [ tty -s ];
then
  echo "${FOO}" | tee -a ${BAR_LOG_FILE}
else
  echo "${FOO}" >> ${BAR_LOG_FILE} 
fi

내가 변경한 유일한 변경 사항은 나머지 테스트와 마찬가지로 주위에 괄호를 넣고 if추가한 것 입니다 . 모두 예상대로 작동합니다.;if

리팩토링 결과 BAR_LOG_FILE찾을 수 없는 오류가 발생했습니다.

여기서 무슨 일이 일어나고 있는 걸까요?

답변1

다음 대괄호 if는 쉘 구문이 아니며 스타일 기본 설정에 따라 생략되거나 생략될 수 있습니다.test. (링크된 맨페이지는 외부 test/ [명령을 설명하지만 많은 쉘은 자체 구현을 제공합니다.)

글쓰기

if [ tty -s ];

글쓰기에 해당

if test tty -s;

test/ 에는 연산자 [가 없기 때문에 실패합니다 tty.

if그 뒤에는 그것을 실행하는 명령이 오고, 명령의 종료 코드는 나중에 어떤 분기를 가져올지 결정합니다 if. 0이면 then해당 분기를 가져오고, 그렇지 않으면 해당 else분기(있는 경우)를 가져옵니다.

관련 정보