저는 각 인수를 명령으로 실행하는 bash 스크립트를 작성하고 있습니다. 이는 my 의 명령에는 작동 PATH
하지만 별칭에는 작동하지 않습니다. 별칭은 스크립트에서 직접 호출할 수 있지만 매개변수로 전달된 별칭은 호출할 수 없습니다.
문제는 별칭이 변수보다 먼저 확장된다는 것입니다. 변수에서 별칭을 실행하는 방법이 있나요?
예시 스크립트:
#!/bin/bash
# File: runall
shopt -s expand_aliases
source ~/.aliases
while (( "$#" )); do
$1
shift
done
runall "echo test"
작동하지만 runall "myalias"
제공runall: line 8: myalias: command not found
답변1
몇 가지 테스트를 거쳐 다음과 같은 결론에 도달했습니다.
-i
별칭은 대화형 모드( shebang에 추가됨)에서만 작동합니다 .- 별칭은 해석된 소스(이 경우 변수)에서 오는 경우 평가되지 않습니다.
- bash에 별칭을 사용하도록 지시할 수 있습니다
eval $1
. 변수를 사용하여 생성된 모든 것은eval
위험하지만 스크립트의 전체 요점은 임의의 실행을 요구하므로 크게 다루지는 않을 것입니다.
Bash 매뉴얼 페이지에서:
셸이 비대화형인 경우, Shopt를 사용하여 Expand_aliases 셸 옵션을 설정하지 않으면 별칭은 확장되지 않습니다(아래 SHELL BUILTIN COMMANDS 아래의 shopt 설명 참조).
shopt -s expand_aliases
따라서 대신 추가할 수 있습니다 -i
.
반품,
별칭은 명령이 실행될 때가 아니라 명령을 읽을 때 확장됩니다.
변수는 명령을 읽을 때까지 확장되지 않으므로 별칭을 사용하여 더 이상 확장되지 않습니다.
답변2
비슷한 문제가 있었고 위에서 언급한 대로 별칭을 함수로 변환하여 문제를 해결했습니다.이 웹사이트, 이것은 나에게 효과적이었습니다.
예를 들어
alias lsd="ls -lash"
도착하다
function lsd() { ls -lash; }