내 ~/.bashrc
파일에는 두 가지 정의가 있습니다.
commandA
commandB
이 두 명령으로 동일한 파일을 처리하고 싶기 때문에 다음 Bash 스크립트를 작성했습니다.
#!/bin/bash
for file in "[email protected]"
do
commandA $file
commandB $file
done
세션에서 로그 아웃하고 다시 로그인 한 후에도 Bash는이 스크립트를 실행할 때 두 명령 모두에 대해 command not found
오류를 표시합니다.
내가 무엇을 잘못하고 있지?
우선, 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
Bash 맨 페이지를 보면 다음을 찾을 수 있습니다.
Expand_aliases Shell 옵션이 shopt를 사용하여 설정되지 않는 한, 셸이 대화식이 아닌 경우 별명은 확장되지 않습니다 (아래의 Shell BUILTIN COMMANDS 아래에서 shopt 설명 참조).
그래서 넣어
shopt -s expand_aliases
당신의 스크립트에서.
스크립트에서 별칭 파일을 설정 한 후 별칭 파일을 제공해야합니다.
shopt -s expand_aliases
source ~/.bash_aliases
별칭은 내보낼 수 없으므로 정의되지 않은 셸 스크립트에서는 사용할 수 없습니다. 즉, ~/.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
프로필을 제공합니다.