나는 그것이 set -e
내 친구가 실수로 그만둔 것이라는 것을 알았다. 하지만 콘솔에서 함수를 실행하는 등 스크립트가 소스로 제공된다면 어떻게 될까요? 오류로 인해 콘솔이 닫히는 것을 원하지 않고 스크립트를 중지하고 오류 메시지를 표시하고 싶습니다.
$를 확인해야 합니까? 이를 가능하게 하려면 각 명령을 수동으로 실행하시겠습니까?
myScript.sh
문제를 보여주는 샘플 스크립트는 다음과 같습니다 .
#!/bin/sh
set -e
copySomeStuff()
{
source="$1"
dest="$2"
cp -rt "$source" "$dest"
return 0
}
installStuff()
{
dest="$1"
copySomeStuff dir1 "$dest"
copySomeStuff dir2 "$dest"
copySomeStuff nonExistingDirectory "$dest"
}
스크립트는 다음과 같이 사용됩니다.
$ source myScript.sh
$ installStuff
그러면 콘솔이 닫힙니다. 표시된 오류가 cp
누락되었습니다.
답변1
스크립트를 서브쉘로 실행하는 것이 좋습니다. 함수 정의를 읽을 수 있는 파일을 얻을 수도 있습니다. 스크립트가 errexit
자체적으로 쉘 옵션을 설정하도록 합니다.
명령줄에서 이를 사용하는 경우 source
"스크립트"는 실제로 대화형 셸입니다. 종료는 쉘 세션을 종료하는 것을 의미합니다. 이 문제를 해결할 수 있는 몇 가지 방법이 있을 수 있지만 errexit
세션을 설정하려는 경우 가장 좋은 방법은 다음과 같습니다.
#!/bin/bash
set -o errexit
source file_with_functions
do_things_using_functions
보너스: 함수의 대화형 세션을 오염시키지 않습니다.
답변2
이를 얻으면 무시되고 호출 셸에 #!
적용되므로 모든 후속 명령에 적용됩니다.set -e
서브셸을 강제로 사용할 수 있습니다.
copySomeStuff()
{
(
set -e
source="$1"
dest="$2"
cp -r "$source" "$dest"
return 0
)
}
또한 안전을 위해:
환경 이름과 충돌할 수 있으므로 변수 이름을 모두 대문자로 사용하지 마십시오. (지난주에 스크립트가 작동하지 않는 이유에 대한 질문이 있었는데, 스크립트에는 변수 PATH가 있었습니다)
따옴표를 사용하세요.
항상
-t
또는-T
옵션cp
,mv
, 을 사용하십시오ln
. 예를 들어cp -t destination_directory source_files …
cp -T source_file destination_file
-t
Gnu 확장 은-T
다른 일부 Unix에서는 사용할 수 없으므로 이식성을 위해 해당-t
옵션을 대체할 수 있습니다.cp source_files … destination_directory/
대체 보안 형태를 알지 못합니다.
-T