동일한 이름을 가진 쉘 함수 내에서 명령을 호출하는 가장 좋은 방법

동일한 이름을 가진 쉘 함수 내에서 명령을 호출하는 가장 좋은 방법

나는 같은 이름을 가진 쉘 함수로 명령을 래핑하는 것을 좋아합니다. 그러나 셸 함수가 재귀적으로 호출되는 것을 방지하기 위해 다음 예와 같이 명령에 대한 전체 경로를 지정합니다.

less()
{
    test 0 -lt $# && echo -ne "\e]2;$@\a\e]1;$@\a"     # Window title
    /usr/bin/less -i -rS --LONG-PROMPT --shift 5 "$@"
}

그러나 일부 명령의 경우 경로가 변경될 수 있으므로 경로를 지정하고 싶지 않습니다. 차라리 $PATH.

예를 들어 다음 시도는 mvn백슬래시를 사용하여 명령을 호출하지 못했습니다.\mvn

mvn()  # colorizes maven output
{
        \mvn "$@" 2>&1 | #here: the shell-function recursively calls itself indefinitely
        sed -u '                                             
    s/^\[ALL\].*/\o033[1;37m&\o033[0m/
  s/^\[FATAL\].*/\o033[1;31m&\o033[0m/
  s/^\[ERROR\].*/\o033[1;31m&\o033[0m/
s/^\[WARNING\].*/\o033[1;33m&\o033[0m/
   s/^\[INFO\].*/\o033[1;37m&\o033[0m/
  s/^\[DEBUG\].*/\o033[1;36m&\o033[0m/
  s/^\[TRACE\].*/\o033[1;32m&\o033[0m/'
}

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
다른 쉘 함수 이름을 사용하는 것을 제안하지 마십시오.

(주로 이것을 사용 bash하지만 다른 쉘 솔루션에도 관심이 있습니다.)

답변1

함수가 아닌 실제 명령 앞에 내장된 쉘을 추가하면 command원하는 작업이 정확하게 수행됩니다. 따라서 쉘 함수는 다음과 같아야 합니다.

mvn()
{
        command mvn "$@" 2>&1 |
        sed -u '
    s/^\[ALL\].*/\o033[1;37m&\o033[0m/
  s/^\[FATAL\].*/\o033[1;31m&\o033[0m/
  s/^\[ERROR\].*/\o033[1;31m&\o033[0m/
s/^\[WARNING\].*/\o033[1;33m&\o033[0m/
   s/^\[INFO\].*/\o033[1;37m&\o033[0m/
  s/^\[DEBUG\].*/\o033[1;36m&\o033[0m/
  s/^\[TRACE\].*/\o033[1;32m&\o033[0m/'
}

답변2

어떤 쉘을 사용하는지에 따라 다릅니다. 기본적으로 zfs, bash 및 ksh는 별칭에서 동일한 이름을 가진 별칭을 확장하지 않습니다. 이는 [종종 의도하지 않은] 루프를 방지하기 위한 것입니다.

따라서 원하는 명령을 안전하게 실행할 수 있습니다.

alias ls="echo Hello; ls"

완전히 괜찮아요.

관련 정보