기존 함수와 동일한 이름으로 PATH에서 실행 파일 실행 if [ -z

때로는 실행 파일을 가리고 인수 또는 출력을 조정하는 함수를 정의합니다. 따라서 함수의 이름은 실행 파일과 동일하므로 함수를 재귀 적으로 호출하지 않고 함수에서 실행 파일을 실행하는 방법이 필요합니다. 예를 들어, 자동으로 출력 실행 fossil diff을 통해 colordiff그리고 less -R내가 사용을 :

function fossil () {
    local EX=$(which fossil)
    if [ -z "$EX" ] ; then
        echo "Unable to find 'fossil' executable." >&2
        return 1
    fi
    if [ -t 1 ] && [ "$1" == "diff" ] ; then
        "$EX" "$@" | colordiff | less -R
        return
    fi
    "$EX" "$@"
}

실행 파일의 위치를 ​​확인하려면 간단히 입력 할 수 /usr/bin/fossil있습니다. Bash /는 명령이 함수가 아니라 실행 파일 임을 의미합니다. 그러나 정확한 위치를 모르기 때문에 전화를 걸어 which결과를 확인해야합니다. 더 간단한 방법이 있습니까?



답변

command쉘 내장을 사용하십시오 .

bash-4.2$ function date() { echo 'at the end of days...'; }

bash-4.2$ date
at the end of days...

bash-4.2$ command date
Mon Jan 21 16:24:33 EET 2013

bash-4.2$ help command
command: command [-pVv] command [arg ...]
    Execute a simple command or display information about commands.

    Runs COMMAND with ARGS suppressing  shell function lookup, or display
    information about the specified COMMANDs.  Can be used to invoke commands
    on disk when a function with the same name exists.


답변

스크립트에서 #!라인은 종종 /bin/env bash경로를 기반으로 bash 명령을 실행하는 데 사용 됩니다. (일부 유틸리티에서는 다를 수 있습니다). 이것은 여기에서도 작동합니다 …

( command대안은 작동하지만 특정 쉘에 따라 다를 수 있습니다) (Solaris의 Bourne Shell에서 작동하지만 실제로는 /bin/commandBash에 내장 된 쉘 인 경우)

모두 /bin/command/bin/env호환되는 모든 구현을해야하므로, SUS에 나열되어 있습니다.


답변

Gert의 답변을 통해 하나 nice의 목적으로도 사용할 수 있음을 알았습니다 (실제로 스크립트 중 하나에서 그것을 실현하지 않고 사용했습니다).

$ function date() { echo 'at the end of days...'; }
$ date
at the end of days...
$ nice -n0 date
Mon Jan 21 16:45:21 CET 2013

다른 답변보다 우아하지는 않지만 상황에 따라 유용한 옵션이 될 수 있습니다.


답변