백틱을 사용하지 않고 명령줄 프롬프트(PS1)에서 코드를 실행할 수 있는 방법이 있습니까?

백틱을 사용하지 않고 명령줄 프롬프트(PS1)에서 코드를 실행할 수 있는 방법이 있습니까?

명령 프롬프트(PS1)에서 이 코드를 직접 사용하면 이전 명령이 올바르게 실행되었는지 여부를 알 수 있습니다.

PS1="\`if [ \$? = 0 ]; then echo -e \"\e[1;32m[⚡️ ]\"\e[0m; else echo -e \"\e[1;31m[

답변1

PS1="\`if [ \$? = 0 ]; then ... fi\`

업데이트: 그래서 간단한 "$()"를 시도했지만 작동하지 않습니다. 또한 이제 슬래시("\$()")를 추가하면 작동하기 때문에 더욱 혼란스럽습니다.

이것은 \슬래시가 아니라 백슬래시입니다.

여기서 이스케이프해야 하는 이유 $는 첫 번째 스니펫에서 백틱을 이스케이프한 이유와 같습니다. 그렇지 않으면 명령 대체가 확장되기 때문입니다., 설정되면 프롬프트를 생성하는 데 사용되지 PS1않습니다 PS1.

할당 주위에 작은따옴표를 사용하는 것이 좋습니다. 이렇게 하면 변수 확장과 전체 문자열의 명령 대체가 방지됩니다.

PS1='$(if [ $? != 0 ]; then echo -e "\[\e[1;31m\][boom]\[\e[0m\] "; fi)\u@\h \w\$ '

\[ ... \]bash에게 인쇄되지 않으며 프롬프트 너비를 계산할 때 고려해서는 안 된다는 점을 알리기 위해 이스케이프 코드를 래핑해야 합니다.수동). (Bash가 사용하는 그래픽 문자를 올바르게 처리하는지 모르므로 테스트할 수 없습니다.)

답변2

백틱 표기법이 마음에 들지 않습니다. ``를 사용하지 않고 이를 수행할 수 있는 방법이 있습니까?

함수가 호출되고 결과가 표시되지만 조건이 실행되지 않는 것 같거나 오히려 반환된 상태 코드가 항상 0인 것 같습니다. 따라서 항상 조건의 첫 번째 부분을 표시합니다.

이것에 대한 생각이 있나요? 나는 이것이 명령 대체가 실행되는 순서와 관련이 있다고 생각합니다.

  • 내 제안은 모두 전송하는 것입니다논리도착하다프롬프트 명령변수는 상황을 명확하게 해줍니다.
    명시된 바와 같이Bash 프롬프트 방법 가이드 이 변수의 내용은 일반 Bash 명령으로 실행됩니다. 직전 배쉬 쇼 프롬프트, 이는 $PS1변수를 호출하기 전을 의미합니다.

예를 들어:

    # Notice that we need to save the exit status to preserve it
    # and avoid what you are reporting(always returning 0)
    choose_icon() {
        RET=$?; # Save the exit status
        # Using short circuit evaluation to make statement shorter
        [[ $RET != 0 ]] && ISTATUS=

관련 정보