추가 읽기

추가 읽기

zsh에서 스크립트를 사용하면 오류가 발생하지만 오류는 stderr 대신 프롬프트에 작은 빨간색 x를 반환합니다. Bash에서 스크립트를 사용하면 오류가 반환되지 않고 예상대로 작동합니다. OMZ 등을 사용하지 않고 가장 기본적인 zsh만 사용합니다.

어디를 봐야 할지 알 수 있도록 zsh에서 오류를 인쇄할 수 있는 방법이 있나요?


나는 이것이 내가 설치한 소프트웨어와 zsh와 관련된 모든 것과 관련이 없다고 생각합니다. 그러나 나는 어디서부터 찾아야 할지조차 모릅니다. 관심 있는 분들은 더 많은 배경 정보를 찾아보실 수 있습니다:

저는 전산유체역학(CFD) 시뮬레이션에 일반적으로 사용되는 소프트웨어 패키지를 설치했습니다.오픈 버블. OpenFOAM은 다양한 버전을 사용할 수 있는 프로젝트이며, 서로 다른 버전을 동시에 로드하면 네임스페이스 충돌이 발생할 수 있으므로 별칭을 사용하여 단일 버전을 셸 경로에 로드하는 것이 일반적입니다. 예를 들어 내 .zshrc파일에는 다음 줄이 포함되어 있습니다.

alias  of5x="source $HOME/OpenFOAM/OpenFOAM-5.x/etc/bashrc $FOAM_SETTINGS"
alias  of4x="source $HOME/OpenFOAM/OpenFOAM-4.x/etc/bashrc $FOAM_SETTINGS"
alias of30x="source $HOME/OpenFOAM/OpenFOAM-3.0.x/etc/bashrc $FOAM_SETTINGS"

별칭을 사용하여 최신 버전( )을 로드하면 5x명령줄에 빨간색이 표시됩니다.x

터미널 스크린샷

답변1

문제의 스크립트는 다음과 같이 모든 POSIX 호환 셸에서 사용할 수 있습니다.

# 모든 POSIX 호환 쉘(예: ksh)에서 사용할 수 있어야 합니다.

OpenFOAM의 이 섹션에 있는 스크립트는 간단히 C 쉘 스크립트와 POSIX 호환 쉘 스크립트의 두 부분으로 나뉩니다. 이 특정 스크립트는 if, , 및 [를 제외하고는 export거의 수행하지 않으며 unsetBourne Again 쉘 기능으로 인해 어려움을 겪지 않습니다.

간단한 사실은 질문입니다.틀리게상태

나는 가장 기본적인 zsh를 사용한다

실제로 질문자는분명히PROMPT마지막 명령의 종료 상태가 0이 아닌 경우 (예:이건 전력선 테마에서 따온 거예요). 틀림없이이것은스크립트의 마지막 명령은 다음과 같으므로 이 특정 스크립트에는 0이 아닙니다.

[ "$BASH" ] && . $WM_PROJECT_DIR/etc/config.sh/bash_completion

이로 인해 Z 셸에서 0이 아닌 스크립트 종료 상태가 생성되어 질문자의 프롬프트에 빨간색 문자가 표시됩니다. 아이러니하게도 이 검사는 스크립트가 Korn 및 Z 쉘에서 원활하게 실행되는지 확인하기 위해 수행됩니다. 실제로 적십자 및 종료 상태는 순전히 외관상의 문제입니다.

프롬프트에서 Powerline 관련 로케일 비표준 유니코드 문자를 사용하는 것은 이것이 여기에서 실행되는 일반적인 Z 셸 프롬프트가 아님을 나타냅니다.

추가 읽기

답변2

zsh두 가지 다른 언어에 대한 통역사 인 경우 에 대해 작성한 코드를 해석할 수 있을 것이라고 bash기대할 수는 없지만 다음과 같이 할 수 있습니다.zshbash

alias of5x="emulate bash -c 'source $HOME/OpenFOAM/OpenFOAM-5.x/etc/bashrc $FOAM_SETTINGS'"

이 명령을 실행 하기 위해 시뮬레이션 모드로 zsh들어가는 데 사용됩니다 .bashsource

이렇게 하면 emulatezsh와 bash의 차이가 줄어들지만 제거되지는 않습니다. 이 소스 파일에 선언된 모든 함수는 시뮬레이션 모드를 유지합니다.

어쨌든, bash와 zsh의 프롬프트 변수 형식은 완전히 다르기 때문에 bash용으로 특별히 작성된 스크립트가 zsh에서도 작동하는 프롬프트를 정의할 수 있을 것이라고는 기대하지 않습니다.

답변3

JdeBP의 답변에서 언급한 대로 오류와 함께 종료되는 스크립트를 수정할 수 있습니다.

true마지막 줄 뒤에 추가됨

[ "$BASH" ] && . $WM_PROJECT_DIR/etc/config.sh/bash_completion
true

또는 또 다른 옵션은 마지막 줄을 다음으로 변경하는 것입니다.

if [ "$BASH" ]; then . $WM_PROJECT_DIR/etc/config.sh/bash_completion; fi

관련 정보