set -u 사용이 예상대로 작동하지 않음

스크립트에서 다양한 set 옵션을 효율적으로 사용하는 방법을 배우고 있습니다. 변수가 제대로 설정되지 않은 경우 (예 : 사용자 삭제) 내 스크립트를 종료하는 데 완벽한 것으로 보이는 set -u를 발견했습니다. man 페이지에 따르면 set -uset -e는 다음을 수행합니다 …

-e Exit immediately if a command exits with a non-zero status. -u Treat unset variables as an error when substituting. 

이 기능을 테스트하기 위해 테스트 스크립트를 만들었지 만 예상대로 작동하지 않는 것 같습니다. . 누군가가 내 문제를 더 잘 설명하고 내가 잘못 해석하는 곳을 설명해 줄 수 있습니까? 테스트 스크립트는 다음과 같습니다. 감사합니다.

set -e set -u testing="This works" echo $? echo ${testing} testing2= echo $? echo ${testing2} testing3="This should not appear" echo $? echo ${testing3} 

스크립트에 0 “작동합니다”, ${testing2}가 설정되지 않았습니다.

대신 0 “작동합니다”, 0 다음에 0 표시되지 않아야합니다.

누군가 지식을 제공 할 수 있습니까? 감사합니다.

댓글

  • 후속 조치 … 변수를 null 문자열로 설정하는 것을 불법으로 만들거나 오류를 발생시키는 방법이 있습니까? ' 아닙니다.

답변

에서 man Bash “:

값이 할당 된 경우 매개 변수가 설정됩니다. 널 문자열은 유효한 값입니다. 변수가 설정되면 unset 내장 명령을 사용해야 만 설정을 해제 할 수 있습니다.

testing2= 변수를 null 문자열로 설정합니다.

unset testing2로 변경하고 다시 시도하세요.


set -e는 할당에 종료 코드 1이 없으므로 도움이되지 않습니다. 마지막으로 실행 된 명령 (할당)의 종료 코드가 0인지 확인하려면이를 시도하십시오. div id = “440d1cb6d2″>

이 질문 읽기 :

$ false; a=""; echo $? 0 

또한 set -e의 사용은 더 많은 문제가 해결책입니다.

설정되지 않은 변수 사용시 오류가 발생할 수있는 것은 set -u입니다.

#!/bin/bash set -u testing="This works" echo ${testing} unset testing2 echo ${testing2} testing3="This should not appear" echo ${testing3} 

출력 :

$ ./script.sh This works ./script.sh: line 9: testing2: unbound variable 

답변

testing2=testing2 변수를 빈 문자열로 설정합니다. 변수는 실제로 설정되어 있습니다 .

그러나 대화 형 Bash 셸에서 echo $testing99를 실행하려는 경우 (errexit, 즉 set -e), 다음 오류가 발생합니다.

bash: testing99: unbound variable 

곁에

지금 스크립트를 테스트하는 동안 대화 형 이 항상 종료되는 것은 아닙니다. 비대화 형 셸 (셸 스크립트 실행)에서 설정되지 않은 변수를 확장하려고 할 때 항상 종료 . set에 대한 POSIX man 페이지에 따르면 :

-u 쉘은 표준 오류에 메시지를 기록합니다. 설정되지 않은 변수를 확장하려고 할 때 즉시 종료됩니다. 대화 형 쉘은 종료되지 않습니다.

errexit 또한 설정되었습니다. 반면에 대화 형 대시 셸은 set -e가 이전에 실행 되었더라도 종료되지 않습니다.

댓글

  • 대시가 set -e로 종료되지 않는 경우; U를 설정; unset aa; echo $ aa, 그러면 대시가 잘못되었습니다.
  • @schily 이것을 처음 발견했을 때 대시 작성자가 나보다 더 잘 알고 있고 POSIX 사양에 약간의 모호함이 있었지만 다시 pubs.opengroup.org/onlinepubs/9699919799/utilities/ … 를 확인했으며 버그처럼 보이는 것에 동의합니다. 좋습니다.
  • 간단한 규칙이 있습니다. Korn Shell과 Bourne Shell이 모두 동의하고 다른 쉘 구현에 편차가 있으면 다른 쉘이 잘못 작동합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다