깊은 디렉토리 트리에 다양한 버전의 쉘 스크립트가 있습니다. 이를 단순화하기 위해 별칭을 생성하는 기능을 추가했습니다(명령줄 옵션을 통해 선택).
function make_alias {
local CMD NAME
NAME=$( basename ${BASH_SOURCE[0]} )
CMD=$( realpath ${BASH_SOURCE[0]} )
echo "alias $NAME=\"$CMD\""
exit 0
}
실행하면 stdout에 유효한 별칭 명령이 생성됩니다.
$ ./myscript -a
alias myscript="/home/symcbean/library/tools/webserver/myscript"
잘라서 붙여넣으면 작동합니다.
그러나 현재 셸에서 출력을 얻으려고 하면 오류가 발생합니다.
$ source $(./myscript -a)
-bash: alias: No such file or directory
내가 무엇을 놓치고 있나요?
(Ubuntu 22.04에서 bash 5.1.16 사용)
답변1
source $(./myscript -a)
그건 작동하지 않습니다. source
다른 쉘 스크립트 파일의 소스 코드를 읽고 이를 현재 쉘에서 실행하는 것을 의미합니다. 그렇게 할 수 eval $(./myscript -a)
는 있지만 음, 별칭에 대한 정말 어색한 사용 사례입니다.
솔직히 저는 /var/run 아래 디렉토리에 스크립트에 대한 심볼릭 링크를 넣고 경로에 추가했습니다(아직 경로의 일부가 아닌 경우).
function make_alias {
local executable
local binpath
executable=$0
binpath="/var/run/${UID}/shortcuts"
mkdir -p "${binpath}"
# next 3 lines adapted from https://superuser.com/a/39995/563936
if [[ ":$PATH:" != *":${binpath}:"* ]]; then
PATH="${PATH:+"$PATH:"}${binpath}"
fi
# Place symlink in /var/run sudirectory
ln -s "$(realpath "${executable}")" "${binpath}/$(basename "${executable}")"
}
개인적으로 나는 이것이 수많은 별칭으로 쉘을 복잡하게 만드는 것보다 훨씬 더 우아하다고 생각합니다. 선택 항목에 배치하여 $PATH
우선 순위를 정의할 수 있습니다. 즉 중요한 시스템 명령이 실수로 숨겨지지 않고 type
여전히 which
눌러져 있습니다. 예상대로 작동하며 가져오기 쉽습니다. (해당 디렉토리를 확인하여) 생성한 바로가기에 대한 개요 및 바로가기는 각 셸에서 설정하지 않고 여러 셸 간에 전송됩니다(두 셸 모두에 존재하는 한 $binpath
)$PATH
...