내 Bash 스크립트가 별칭을 인식하지 못하는 이유는 무엇입니까?

내 Bash 스크립트가 별칭을 인식하지 못하는 이유는 무엇입니까?

~/.bashrc파일에는 두 가지 정의가 있습니다.

  1. commandA, 이는 더 긴 경로의 별칭입니다.
  2. commandB, 이는 Bash 스크립트의 별칭입니다.

이 두 명령을 사용하여 동일한 파일을 처리하고 싶었기 때문에 다음 Bash 스크립트를 작성했습니다.


#!/bin/bash

for file in "$@"
    do
    commandA $file
    commandB $file
done

세션에서 로그아웃했다가 다시 로그인한 후에도 command not found이 스크립트를 실행하면 Bash는 두 명령 모두에 대해 오류 메시지를 표시합니다.

내가 뭘 잘못했나요?

답변1

bash 맨페이지를 보면 다음을 찾을 수 있습니다.

셸이 비대화형인 경우, Shopt를 사용하여 Expand_aliases 셸 옵션을 설정하지 않으면 별칭은 확장되지 않습니다(아래 SHELL BUILTIN COMMANDS 아래의 shopt 설명 참조).

그러므로

shopt -s expand_aliases

귀하의 스크립트에서.

별칭 파일을 스크립트에서 설정한 후 가져와야 합니다.

shopt -s expand_aliases
source ~/.bash_aliases

답변2

첫째, ddeimeke가 말했듯이 별칭은 비대화형 쉘에서 기본적으로 확장되지 않습니다.

둘째, .bashrc환경 변수를 설정하지 않으면 비대화형 쉘은 이를 읽지 않습니다 BASH_ENV.

하지만 가장 중요한 것은 하지 마세요! 제발? 어느 날 필요한 별칭이 설정되지 않은 곳으로 스크립트를 이동하면 다시 작동이 중단됩니다.

대신 스크립트에서 변수를 바로가기로 설정하고 사용하세요.

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "$@"
do
    $CMDA "$file"
    $CMDB "$file"
done

답변3

별칭은 내보낼 수 없으므로 별칭을 정의하지 않는 쉘 스크립트에서는 사용할 수 없습니다. 즉, 에서 정의하면 ~/.bashrc사용할 수 없습니다 your_script.sh( ~/.bashrc권장하지는 않지만 스크립트에서 소스 코드를 가져오지 않는 한 이를 올바르게 수행할 수 있는 방법이 있습니다).

그러나 함수를 내보내고 해당 함수가 정의된 환경에서 실행되는 셸 스크립트에 사용할 수 있게 만들 수 있습니다. bashrc에 다음을 입력하면 됩니다.

푸()
{
    "Hello World!"의 메아리
}
내보내기 -f foo

Bash 매뉴얼에 따르면 "거의 모든 목적에서 쉘 함수는 별칭보다 우수합니다."

답변4

.스크립트 전에 사용할 수도 있습니다 . 다음과 같이 실행하세요:

. /path/to/your/script.sh

다음과 같이 bash 스크립트에서 이 상황을 확인할 수 있습니다.

if [[ $- == *i* ]]
then
    echo "running on interactive mode. aliases will work!"
fi

관련 정보