
실제로 같은 이름의 다른 별칭을 확장하는 별칭을 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} "$@"