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