.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