스크립트 내의 별칭에 $@: "로컬" $@가 있습니까?

스크립트 내의 별칭에 $@: "로컬" $@가 있습니까?

bash 셸에서 별칭을 다음과 같이 설정하여 pushd출력을 억제했습니다.

alias pushd='pushd "$@" > /dev/null'

이것은 대부분의 경우에는 잘 작동하지만 이제 매개변수가 있는 함수에서 사용하는 데 문제가 있습니다. 예를 들어,

test() {
  pushd .
  ...
}

매개변수 없이 실행하면 test됩니다 . 그러나 다음과 같은 주장이 있습니다.

> test x y z
bash: pushd: too many arguments

제 생각 엔 그냥 매개변수가 아닌 매개변수로 pushd만들려는 시도인 것 같아요 . 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까? 볼 수만 있고 볼 수는 없는 "로컬"에 해당하는 것이 있습니까 ?. x y z.$@.x y z

답변1

별칭은 셸 이벤트가 코드 구문 분석을 시도하기 전에 셸 토큰을 문자열로 바꾸는 방법을 정의합니다. 함수와 같은 프로그래밍 구조가 아닙니다.

존재하다

alias pushd='pushd "$@" > /dev/null'

그런 다음:

pushd .

pushd결과는 다음 으로 대체된 다음 구문 분석 됩니다 pushd "$@" > /dev/null. 따라서 쉘은 최종적으로 다음을 구문 분석합니다.

pushd "$@" > /dev/null .

리디렉션은 명령줄의 어느 위치에나 나타날 수 있으므로 다음과 정확히 동일합니다.

pushd "$@" . > /dev/null

또는

> /dev/null pushd "$@" .

프롬프트에서 명령을 실행할 때 "$@"쉘이 수신하는 인수 목록은 다음을 실행 set arg1 arg2하지 않으면 비어 있을 수 있습니다 .

pushd . > /dev/null

하지만 함수 내부에서는 이것이 "$@"함수의 매개변수가 됩니다.

pushd여기에서 다음과 같은 함수를 정의하고 싶을 수도 있습니다 .

pushd() { command pushd "$@" > /dev/null; }

또는 다음과 같은 별칭:

alias pushd='> /dev/null pushd'

또는

alias pushd='pushd > /dev/null

관련 정보