쉘 별칭을 "스택"하는 방법은 무엇입니까?

쉘 별칭을 "스택"하는 방법은 무엇입니까?

내 시뮬레이션 모드 .profile에는 다음 과 같은 코드 조각이 있습니다.sh.zshrc

if [ -f /usr/bin/pacmatic ]; then
    alias pacman=pacmatic
fi

# Colorized Pacman output
alias pacman="pacman --color auto"

그러나 두 번째 별칭은 항상 첫 번째 별칭보다 우선합니다.

% type pacman
pacman is an alias for pacman --color auto

/usr/bin/pacmatic두 번째 별칭 할당이 첫 번째 할당을 "상속" 하여 존재하는 경우 별칭이 가 되도록 하려면 어떻게 해야 합니까 pacmatic --color auto?

나는 별칭 대신 함수를 사용하는 것을 반대하지는 않지만, 호출될 때마다 논리가 실행되지 않는 것이 더 좋습니다 ( 셸이 실행될 때마다 확인하는 것이 아니라 셸이 시작할 때 한 번 확인 pacman하고 싶습니다 ). 또한 이식 가능한 스크립트를 선호 하지만 이것이 불가능할 경우 전체 구문을 사용할 수 있습니다.pacmaticpacmanshzsh

(예, 별칭을 추가하면 이 문제를 쉽게 해결할 수 있다는 것을 알고 있습니다 --color auto. pacmatic하지만 올바른 방식으로 수행하고 싶습니다™.)

인터넷 검색과 매뉴얼 페이지 탐색을 시도했지만 소용이 없었습니다.

답변1

별칭 대체는 대화형 소스에서 행을 읽을 때만 수행됩니다. 따라서 두 번째 별칭은 첫 번째 별칭의 영향을 받지 않으므로 리터럴 대체입니다.

어쩌면 다음과 같을 수도 있습니다:

PACMAN=pacman
if [ -f /usr/bin/pacmatic ]; then
    PACMAN=pacmatic
fi

# Colorized Pacman output
alias pacman="${PACMAN} --color auto"

이렇게 하면 'pacman'이 올바른 값으로 설정되고, PACMAN 환경 변수는 내보내지지 않으므로 스크립트가 완료되면 사라지며, "큰따옴표"를 사용하면 매번이 아닌 별칭 선언 내에서 변수 대체가 발생하도록 보장됩니다. 옮기다.

나는 비슷한 접근 방식을 사용합니다.

PACMAN=pacman
which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN} --color auto"

기본적으로 환경 변수 PACMAN을 설정하고, 경로에서 pacmatic을 테스트하고, 발견되면 PACMAN을 설정한 다음 별칭을 정의합니다.

뭐, 좀 더 최적화할 수는 있겠지만...

which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN:-pacman} --color auto"

다다! PACMAN이 설정되지 않았거나 비어 있으면 "pacman"으로 설정되고, 그렇지 않으면 PACMAN의 값으로 설정되고 "which" 라인을 통해 pacmatic으로 설정됩니다.

답변2

쉘은 alias매우 유사하게 동작합니다 #define. 즉, 쉘 별칭을 다시 정의하면 이전 별칭을 덮어쓰게 됩니다.

올바른 방법이 무엇 인지 잘 모르겠지만 한 가지 방법은 인수를 받아들이는 쉘 함수를 사용하고 이를 사용하여 별칭을 만드는 것입니다. 코드 조각은 다음과 같이 다시 작성할 수 있습니다.

if [ -f /usr/bin/pacmatic ]; then
    pacman() { pacmatic "$@"; }
fi

# Colorized Pacman output
alias pacman="pacman --color auto"

 


또한 다른 별칭을 사용하고 그 중 하나를 사용하여 다른 별칭을 정의하려고 해도 별칭은 기본적으로 비대화형 모드에서 확장되지 않기 때문에 작동하지 않습니다. 설정을 통해 활성화해야 합니다 expand_aliases.

shopt -s expand_aliases

매뉴얼 인용 :

   Aliases are not expanded when the shell is not interactive, unless  the
   expand_aliases  shell option is set using shopt (see the description of
   shopt under SHELL BUILTIN COMMANDS below).

답변3

zsh에서는 다음을 사용하여 별칭에 쉽게 추가할 수 있습니다.aliases연관 배열:

alias pacman="${aliases[pacman]-pacman} --color auto"

다른 셸에서는 명령 출력을 사용하여 alias기존 별칭을 찾아야 합니다.

current_pacman_alias=$(alias pacman 2>/dev/null)
alias pacman="${current_pacman_alias:-pacman} --color auto"

이 가능성을 제공하는 동안 다른 답변에서 이미 제안한 대로 변수를 사용하겠습니다. 더 깔끔하며 pacmatic어떤 변수가 사용되는지에 따라 무언가를 다르게 구성하려는 경우 변수 값을 구별할 수 있습니다.pacman

pacman==pacmatic 2>/dev/null || pacman=pacman
alias pacman='$pacman --color auto'

답변4

pacman() ( def_args="--color auto" bin=
    [ -x ${bin:=/usr/bin/pacmatic} ] || bin=
    [ -x ${bin:=/usr/bin/pacman} ] || bin= 
    ${bin:?WHERE THE HELL IS PACMAN????} \
        $def_args "$@"
)

별명은 새의 별명입니다.

관련 정보