![내 Bash 스크립트가 별칭을 인식하지 못하는 이유는 무엇입니까?](https://linux55.com/image/397/%EB%82%B4%20Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80%20%EB%B3%84%EC%B9%AD%EC%9D%84%20%EC%9D%B8%EC%8B%9D%ED%95%98%EC%A7%80%20%EB%AA%BB%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내 ~/.bashrc
파일에는 두 가지 정의가 있습니다.
commandA
, 이는 더 긴 경로의 별칭입니다.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