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


16

때로는 실행 파일을 가리고 인수 또는 출력을 조정하는 함수를 정의합니다. 따라서 함수의 이름은 실행 파일과 동일하므로 함수를 재귀 적으로 호출하지 않고 함수에서 실행 파일을 실행하는 방법이 필요합니다. 예를 들어, 자동으로 출력 실행 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결과를 확인해야합니다. 더 간단한 방법이 있습니까?


1
"Bash /는 명령이 기능이 아니라 실행 파일 임을 의미합니다." 엄밀히 말하면, 사실이 아닙니다. 내가 끔찍한 (그리고 문서화되지 않은) 디자인 결정이라고 생각하는 것에서 bash는 함수 이름에 슬래시를 포함시킬 수 있습니다. 슬래시는 단순히 /usr/bin/fossil와 다른 문자열fossil되므로, 말할 때 함수 /usr/bin/fossil를 실행하려고 시도하지 않습니다 fossil.
G-남자 '는 분석 재개 모니카'말한다

답변:


19

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
또 다른 옵션은 명령을 이스케이프 처리하는 것 \date입니다.
jordanm

4
@jordanm, 별칭에만 작동합니다. 문제는 기능에 관한 것이었다. pastebin.com/TgkHQwbb
manatwork

3

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

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

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


지적 해 주셔서 감사합니다 env. 어떤 대답을 받아 들여야하는지 의심 스러웠지만 질문은 bash 에 관한 것이므로 기본 command제공 방법이 가장 좋습니다.
Petr Pudlák

1
내 리눅스가 더없는 command실행,하지만 command도에서 작동 dash, kshzsh. 그래서 나는 그것이 내장 된 쉘이라고 가정합니다 bash. pastebin.com/fi3gyNse
manatwork

Solaris 10 Bourne에 내장되어 있지 않습니다 (이는 heirloom-sh로도 제공됨). 알려진 경로를 가진 실행 파일의 장점은 함수로 덮어 쓸 수 없다는 것입니다.
Gert van den Berg

(스크립트를 사용하는 이유 / 빈 부재는 / 명령을 설명 할 수 /bin/env가 하드 코드 쉘 경로를하지 않으려면 해시 뱅 후)
거트 반 베르그 덴

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

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


비슷한 대안을 포함하도록 이것을 확장 할 수 있습니다 `which date`..
Eliah Kagan

1
@EliahKagan 문제 `which something`something실행 파일 이 없으면 불행한 일이 발생할 수 있다는 것입니다. 예를 들어 echo누락 된 `which echo` /bin/rm preciousFile경우 의도 한 것과 매우 다른 작업 을 수행합니다.
Petr Pudlák
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.