나는 같은 이름을 가진 쉘 함수로 명령을 래핑하는 것을 좋아합니다. 그러나 셸 함수가 재귀적으로 호출되는 것을 방지하기 위해 다음 예와 같이 명령에 대한 전체 경로를 지정합니다.
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"
완전히 괜찮아요.