Bash 별칭을 확장하는 방법

Bash 별칭을 확장하는 방법

실제로 같은 이름의 다른 별칭을 확장하는 별칭을 Bash에서 어떻게 생성합니까?

왜:

나는 한때 다음과 같은 일을 GREP_OPTIONS했습니다 ..bashrc

GREP_OPTIONS="-I --exclude=\*~"

setup-java.sh또한 일부 Java 프로젝트 작업 전에 호출하는 스크립트(예: )가 있습니다 . 여기에는 다음 줄이 포함됩니다.

GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=classes"

Sass도 사용하고 있다면 setup-sass.sh다음 줄을 포함하는 호출을 할 것입니다:

GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=\*/.sass-cache"

하지만GREP_OPTIONS더 이상 사용되지 않음분명히 표준 솔루션은 별칭이나 일부 스크립트를 만드는 것입니다.

답변1

Bash는 별칭 값을 다음 위치에 저장합니다.이름이 사람 BASH_ALIASES:

$ alias foo=bar
$ echo ${BASH_ALIASES[foo]}
bar

그리고매개변수 확장 마지막으로 설정된 별칭(존재하는 경우) 또는 기본값을 가져올 수 있습니다.

alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~"

이제 다음을 수행하십시오 setup-java.sh.

alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~  --exclude-dir=classes"

...마침내 setup-sass.sh:

alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~ --exclude-dir=\*/.sass-cache"

이 세 줄을 호출하면 원하는 결과를 얻을 수 있습니다.

$ echo ${BASH_ALIASES[grep]:-grep}
grep -I --exclude=\*~ -I --exclude=\*~ --exclude-dir=classes -I --exclude=\*~ --exclude-dir=\*/.sass-cache

답변2

aliases공백으로 끝내면 연결됩니다.

alias print='printf %s\\n ' hey='"hello, fine fellow" '
print hey

hello, fine fellow

당신이 충분히 미쳤다면 전체 스크립트를 이런 식으로 작성할 수 있습니다. 어쨌든 별칭을 확장하려면 다른 별칭을 추가하기 전에 확장하려는 별칭이 공백으로 끝나는지 확인하세요.

alias grep='printf "%s " -I --exclude=\*~ '    \
      exdir=' --exclude-dir=classes '          \
      exsass='--exclude-dir=\*/.sass-cache '
grep exdir exsass exdir exsass

-I --exclude=*~ --exclude-dir=classes --exclude-dir=*/.sass-cache --exclude-dir=classes --exclude-dir=*/.sass-cache

답변3

여기서는 확장 가능한 별칭보다 함수가 더 나은 선택입니다.

grep_options=( )
grep() {
  exec /usr/bin/grep "${grep_options[@]}" ${GREP_OPTIONS} "$@"
}

이렇게 하면 환경에 옵션을 추가하는 두 가지 옵션이 있습니다.

  • 배열 수정 grep_options: 공백, 리터럴 전역 문자 및 기타 특수한 경우가 포함된 옵션을 올바르게 지원합니다.

    grep_options+=( --exclude-dir=classes --exclude-dir='*/.sass-cache' )
    
  • GREP_OPTIONS단점에도 불구하고 전통적인 스칼라 변수를 사용합니다 (참조:배쉬 FAQ #50그 중 일부에 대해 알아보세요):

    GREP_OPTIONS+=' --exclude-dir=classes '
    

즉, 쉘 외부에서 호출된 인스턴스에 옵션이 반영되도록 하려면 grep별칭이나 함수가 작동하지 않습니다. 대신 grep실제 명령보다 이전 경로 에 래퍼 스크립트를 배치해야 합니다 . 예를 들어:

# in ~/.bash_profile
[[ -e ~/bin ]] && PATH=$HOME/bin:$PATH

...그리고 다음 ~/bin/grep에서

#!/bin/bash

# load overrides to grep_options on GREP_OPTIONS from local dotfiles
source ~/.bash_profile
source ~/.bashrc

# ...and use them:
exec /usr/bin/grep "${grep_options[@]}" ${GREP_OPTIONS} "$@"

관련 정보