임의의 인수를 재배치하는 메커니즘이없는 bash 별명 문제에 대한 일반화 된 솔루션을 원하는 합법적 인 기술적 이유가 있습니다. 한 가지 이유는 실행하려는 명령이 기능 실행으로 인한 환경 변경으로 인해 부정적인 영향을받는 경우입니다. 다른 모든 경우에는 기능을 사용해야합니다.
최근에 이것에 대한 해결책을 시도하도록 강요 한 것은 변수와 함수의 정의를 인쇄하기위한 약식 명령을 만들고 싶었다는 것입니다. 그래서 나는 그 목적을 위해 몇 가지 기능을 썼습니다. 그러나 함수 호출 자체에 의해 변경되거나 변경 될 수있는 특정 변수가 있습니다. 그들 중에는 :
FUNCNAME BASH_SOURCE BASH_LINENO BASH_ARGC BASH_ARGV
변수 defn을 인쇄하기 위해 (함수에서) 사용했던 기본 명령. set 명령의 출력 형식은 다음과 같습니다.
sv () { set | grep --color=never -- "^$1=.*"; }
예 :
> V=voodoo
sv V
V=voodoo
문제점 : 대화식 쉘 프롬프트 (또는 함수 호출이 아닌 경우)에 FUNCNAME이 정의되어 있지 않은 경우, 현재 컨텍스트 에있는 위에서 언급 한 변수의 정의를 인쇄 하지 않습니다. 그러나 내 기능은 잘못된 정보를 알려줍니다.
> sv FUNCNAME
FUNCNAME=([0]="sv")
내가 생각해 낸 한 가지 해결책은이 주제에 대한 다른 게시물에서 다른 사람들에 의해 언급되었습니다. 이 특정 명령이 변수 defn을 인쇄하고 하나의 인수 만 필요로하기 위해 다음과 같이했습니다.
alias asv='(grep -- "^$(cat -)=.*" <(set)) <<<'
올바른 출력 (없음)과 결과 상태 (거짓)를 제공합니다.
> asv FUNCNAME
> echo $?
1
그러나 나는 여전히 임의의 수의 논쟁에 적합한 해결책을 찾아야한다고 느꼈습니다.
임의의 인수를 Bash 별칭 명령에 전달하는 일반적인 솔루션 :
# (I put this code in a file "alias-arg.sh"):
# cmd [arg1 ...] – an experimental command that optionally takes args,
# which are printed as "cmd(arg1 ...)"
#
# Also sets global variable "CMD_DONE" to "true".
#
cmd () { echo "cmd($@)"; declare -g CMD_DONE=true; }
# Now set up an alias "ac2" that passes to cmd two arguments placed
# after the alias, but passes them to cmd with their order reversed:
#
# ac2 cmd_arg2 cmd_arg1 – calls "cmd" as: "cmd cmd_arg1 cmd_arg2"
#
alias ac2='
# Set up cmd to be execed after f() finishes:
#
trap '\''cmd "${CMD_ARGV[1]}" "${CMD_ARGV[0]}"'\'' SIGUSR1;
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# (^This is the actually execed command^)
#
# f [arg0 arg1 ...] – acquires args and sets up trap to run cmd:
f () {
declare -ag CMD_ARGV=("$@"); # array to give args to cmd
kill -SIGUSR1 $$; # this causes cmd to be run
trap SIGUSR1; # unset the trap for SIGUSR1
unset CMD_ARGV; # clean up env...
unset f; # incl. this function!
};
f' # Finally, exec f, which will receive the args following "ac2".
예 :
> . alias-arg.sh
> ac2 one two
cmd(two one)
>
> # Check to see that command run via trap affects this environment:
> asv CMD_DONE
CMD_DONE=true
이 솔루션의 좋은 점은 명령에 대한 위치 매개 변수 (인수)를 처리하는 데 사용되는 모든 특수 트릭이 트랩 된 명령을 작성할 때 작동한다는 것입니다. 유일한 차이점은 배열 구문을 사용해야한다는 것입니다.
예 :
"$ @"을 원하면 "$ {CMD_ARGV [@]}"을 사용하십시오.
"$ #"을 원하는 경우 "$ {# CMD_ARGV [@]}"을 사용하십시오.
기타.