PATH의 기존 함수와 동일한 이름으로 실행 파일 실행

PATH의 기존 함수와 동일한 이름으로 실행 파일 실행

때로는 실행 파일을 숨기고 해당 매개변수나 출력을 조정하는 함수를 정의합니다. 따라서 함수는 실행 파일과 동일한 이름을 가지며 함수를 재귀적으로 호출하지 않고 함수에서 실행 파일을 실행하는 방법이 필요합니다. 예를 들어, 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/fossilBash는 /명령이 함수가 아니라 실행 파일이라는 뜻이라고 생각합니다. 하지만 정확한 위치를 모르기 때문에 which결과를 확인하기 위해 전화를 해야 했습니다. 더 쉬운 방법이 있나요?

답변1

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.

답변2

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

( command대안도 작동해야 하지만 특정 쉘에 따라 달라질 수 있습니다.) (Solaris의 Bourne Shell에서 작동하지만 /bin/commandBash에 내장된 쉘인 이 경우에는 실제로 작동합니다.)

/bin/command둘 다 /bin/envSUS에 나열되어 있으므로 모든 규정 준수 구현에 이를 포함해야 합니다.

답변3

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

다른 답변만큼 우아하지는 않지만 어떤 상황에서는 유용한 옵션이 될 수 있습니다.

관련 정보