if에서 별칭이 작동하지 않는 이유는 무엇입니까?

if에서 별칭이 작동하지 않는 이유는 무엇입니까?

.bashrc필요에 따라 사용할 수 있도록 여러 개의 별칭을 설정한 다음 그 중 하나를 자동으로 실행합니다 .

대화형 셸을 사용하는 대신 자동화된 스크립트가 내 컴퓨터에 SSH로 연결될 때 이로 인해 몇 가지 문제가 발생한 것으로 나타났습니다. 그래서 이 문제를 해결하기 위해 if 블록에 넣어 자동화 스크립트에 대해 정의되거나 실행되지 않도록 했습니다.

if [ -n "$TERM" ] && [ "$TERM" != "dumb" ] ; then
    alias short='long command here'
    alias another='very long command here'
    # ...

    short
fi

그냥 봐 short: command not found!

최소한으로 줄이자...

$ cat alias.sh
alias foo='echo hi'
foo
$ sh alias.sh
hi
cat alias-in-if.sh
if true ; then
        alias foo='echo hi'
        foo
fi
sh alias-in-if.sh
alias-in-if.sh: line 3: foo: command not found

첫 번째 스크립트는 작동하지만 두 번째 스크립트는 작동하지 않는 이유는 무엇입니까?

(나는 내 ​​자신의 질문에 대답했습니다.)

답변1

나는 주변을 검색한 결과 ifs 내의 별칭과 관련된 것은 아무것도 발견하지 못했고 함수 내의 별칭만 발견했습니다. 처음에는 다른 문제인 것처럼 보였습니다.

그러나 사실,이 답변그것을 고치다:

Bash는 해당 줄에서 명령을 실행하기 전에 항상 입력의 전체 줄을 하나 이상 읽습니다. [...] 이 줄의 별칭 정의 뒤에 오는 명령은 새 별칭의 영향을 받지 않습니다. [...] 안전을 위해 항상 별칭 정의를 별도의 줄에 배치하고 복합 명령에 별칭을 사용하지 마십시오.

이는 함수에만 국한되지 않고 if 문도 포함되는 것 같습니다. 전체 if 블록은 한 줄로 처리됩니다. 별칭이 조건이 true인 경우에만 정의 및 실행되고, 조건이 false인 경우에도 정의되지 않도록 하려면 다음과 같이 조건을 두 번 평가하는 것이 좋습니다.

cat alias-before-if.sh
if true ; then
        alias foo='echo hi'
fi

if true; then
        foo
fi
$ sh alias-before-if.sh
hi

그래서 내 원래 스크립트는 다음과 같습니다.

if [ -n "$TERM" ] && [ "$TERM" != "dumb" ] ; then
    alias short='long command here'
    alias another='very long command here'
    # ...
fi

if [ -n "$TERM" ] && [ "$TERM" != "dumb" ] ; then
    short
fi

관련 정보