it-swarm.dev

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

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

  1. 더 긴 경로의 별명 인 commandA
  2. Bash 스크립트의 별명 인 commandB

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


#!/bin/bash

for file in "[email protected]"
    do
    commandA $file
    commandB $file
done

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

내가 무엇을 잘못하고 있지?

237
Zaid

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

둘째, .bashrc 환경 변수를 설정하지 않으면 비 대화식 쉘에서 BASH_ENV를 읽을 수 없습니다.

그러나 가장 중요한 것은 그렇게하지 마십시오! 부디? 어느 날 필요한 별칭이 설정되지 않은 곳으로 스크립트를 옮기면 다시 끊어집니다.

대신 스크립트에서 환경 변수를 바로 가기로 설정하고 사용하십시오.

#!/bin/bash

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

for file in "[email protected]"
do
    $CMDA "$file"
    $CMDB "$file"
done
125
user601

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

Expand_aliases Shell 옵션이 shopt를 사용하여 설정되지 않는 한, 셸이 대화식이 아닌 경우 별명은 확장되지 않습니다 (아래의 Shell BUILTIN COMMANDS 아래에서 shopt 설명 참조).

그래서 넣어

shopt -s expand_aliases

당신의 스크립트에서.

스크립트에서 별칭 파일을 설정 한 후 별칭 파일을 제공해야합니다.

shopt -s expand_aliases
source ~/.bash_aliases
175
ddeimeke

별칭은 내보낼 수 없으므로 정의되지 않은 셸 스크립트에서는 사용할 수 없습니다. 즉, ~/.bashrc 사용할 수없는 your_script.sh (당신이 ~/.bashrc 스크립트에서 권장하지는 않지만 올바르게 수행하는 방법이 있습니다).

그러나 함수를 내보내고 정의 된 환경에서 실행되는 셸 스크립트에서 사용할 수 있습니다. 이것을 bashrc에 배치하면됩니다.

 foo () 
 {
 echo "Hello World!"
} 
 export -f foo 

Bash 매뉴얼에 따르면, "거의 모든 목적에서 셸 함수는 별칭보다 선호됩니다."

[cmd line] > bash -i [your script's file path]

i은 대화식이며 bash 프로필을 제공합니다.

11
user65576