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


12

.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호출 될 때마다 로직이 수행되지 않은 경우 선호합니다 ( pacmatic쉘 시작시 한 번 확인 하고 싶을 때마다 실행 하고 싶지 pacman는 않습니다 ). 또한 sh이식 가능한 스크립트를 선호 하지만 이것이 불가능한 경우 전체 zsh구문을 사용할 수 있습니다 .

(예, 별명 을 추가 --color auto하면 이 문제를 쉽게 해결할 수 있다는 것을 알고 있습니다 pacmatic. 그러나 Right Way ™를 사용하고 싶습니다.)

인터넷 검색을 시도하고 맨 페이지를 살펴 보았지만 아무 소용이 없습니다.


올바른 방법은 별칭 대신 함수를 사용하는 것이라고 생각했습니다. 별칭보다 (최소한 bash) 빠르며 서로 쉽게 호출 할 수 있다고 들었습니다 .
Wutaz

답변:


5

alias은와 비슷하게 동작합니다 #define. 즉, 쉘 별칭을 재정의하면 이전의 것을 무시합니다.

Right Way TM 이 무엇인지 잘 모르겠지만 한 가지 방법은 매개 변수를 허용하는 쉘 함수를 사용하고 별칭을 만드는 데 사용하는 것입니다. 코드 스 니펫은 다음과 같이 다시 작성할 수 있습니다.

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).

이것은 내가 원하는 것에 가장 가까운 것으로 보이지만 작동하지 않습니다. 에뮬레이션 모드와 기본 모드 모두에서를 type pacman반환 합니다. 그러나 방금 편집 한 내용이 필요한 것 같습니다. pacman is an alias for pacman --color autoshzsh
strugee

FWIW에서 zsh에 해당하는 값은 setopt aliases입니다.
strugee

OP가 사용 중 zsh입니다. 그리고 껍질은 어쨌든 대화 형으로 보입니다.
Mikel

6

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

아마도 비슷한 것 :

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

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

이것은 'pacman'을 적절한 값으로 설정하고 PACMAN env 변수는 내 보내지 않으므로 스크립트가 끝나면 사라지고 "큰 따옴표"를 사용하면 별칭을 선언 할 때 변수 대체가 발생합니다. 각 호출에 대해 아닙니다.

비슷한 방법을 사용합니다.

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

기본적으로 env var PACMAN을 설정하고 경로에서 pacmatic을 테스트 한 후 PACMAN을 설정 한 다음 별명을 정의하십시오.

흠, 당신은 조금 더 최적화 할 수 있습니다 ...

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

타아 다아! PACMAN이 설정되지 않은 경우 'pacman'으로 설정하거나 null 인 경우 PACMAN의 값으로 설정하고 'which'행에 의해 pacmatic으로 설정하십시오.


별칭이 "대화 형 소스"에만 작동하는 이유는 무엇입니까?
Mikel

기본적 bash으로 비 대화식 모드에서 별칭을 확장하지는 않지만 "대화식 소스"와 어떻게 동일합니까?
Mikel

2

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'


0
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 "$@"
)

별명은 새를위한 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.