다음 스크립트가 있습니다.
#!/bin/bash
set -e
TITLE="Choose version"
VERSIONS=$(cat <<'END'
AAA
BBB
END
)
VERSION_LIST=$(echo "$VERSIONS" | awk '{print NR, " ", $0}')
INDEX=$(whiptail \
--no-cancel \
--menu "$TITLE" 15 40 15 \
$VERSION_LIST \
3>&1 1>&2 2>&3)
실행 가능하게 만들고 실행하면 예상대로 작동합니다. bash 또는 zsh 에서 호출하면 source
다음 중 하나가 발생합니다.
- 터미널이 닫힙니다(bash가 종료되는 것 같습니다).
- 터미널은 열려 있지만 곧 충돌/종료됩니다. 재현하는 가장 쉬운 방법은 입력
ls somefile
하고 TAB완료를 누르는 것입니다.
저는 Fedora 29를 사용하고 있으며 Mac OS에서도 이 동작을 볼 수 있습니다. 소스 스크립트에서hiptail/dialog를 사용할 때 특별히 고려해야 할 사항이 있나요?
답변1
스크립트는 errexit
플래그를 설정하는 데 사용됩니다 set -e
. 그것을 얻은 후에는 확인되지 않은 실패한 명령으로 인해 쉘이 종료됩니다. 프로그래밍 가능한 완료 스크립트를 사용하는 경우 그 중 일부는 실패한 명령을 실행할 수 있으며 이는 탭 완성이 이를 트리거하는 이유를 설명할 수 있습니다.
여기서 해결 방법은 스크립트의 소스 코드를 가져오지 않고 평소대로 실행하거나 set -e
모든 관련 명령에 대해 충분한 오류 검사를 수행하고 return
실패하는지 확인하는 것입니다. (아니요 exit
, 이렇게 하면 전체 셸이 종료되고 return
소스 스크립트에서 반환되기 때문입니다.)