시스템 명령과 동일한 이름으로 사용자 정의 함수를 대체


14

이 기능은 내 사용자의 ~ / .bashrc 중 하나에 있습니다.

function rm()
{
        ls $*
        echo "rm?"
        read ans
        if [ "$ans" == 'y' ]; then
                /bin/rm $*
        fi
}

사용자가 실행 해야하는 ksh 스크립트에는 다음과 같은 줄이 있습니다.

[[ "$KEEP" = "" ]] && \rm $FILE

백 슬래시는 사용자 정의 별명을 이스케이프하지만 스크립트가 동일한 이름으로 사용자 정의 함수를 실행하지 못하게합니다. 결과적으로 시스템 함수 대신 사용자의 rm () 함수가 호출됩니다.

수퍼 유저 질문 질문과 응답을 찾았 지만 해결책은 시스템 명령이 아닌 내장 함수에만 적용됩니다.

별칭 또는 함수가 아닌 rm 명령이 호출되지 않도록하는 가장 좋은 방법은 무엇입니까? rm에 대한 전체 경로를 지정해야하며 확인하려는 모든 시스템 명령이 올바르게 실행됩니까? 더 좋은 방법이 있습니까?

답변:


13

command일반적인 bash 함수 검색을 우회하는 데 사용할 수 있습니다 .

command rm

비파괴적인 예 :

$ alias which='which -s'
$ function which { echo "which $@?" ; }
$ which which
which -s which?
$ command which which
/usr/bin/which

또는를 사용하여 env(이름이 지정된 첫 번째 프로그램을 실행 $PATH하거나 전체 경로를 지정 하여) 호출하십시오 .

/usr/bin/env rm
/bin/rm

고마워요, "명령"은 내가 찾는 바로 그 것입니다. 그래도 실행되는 모든 시스템 명령에 사용해야하는 것은 다소 혼란 스럽습니다. 시스템 명령을 실행하는 유일한 확실한 방법은 전체 경로를 지정하는 것입니다. 그러나 해당 접근 방식을 통해 서로 다른 배포판에서 동일한 경로에있는 명령을 사용하고 있습니다.
acm

@acm 내가 쓴 것처럼 env경로를 이동할 수도 있습니다 . 또한 각 공구의 위치를 ​​한 번 결정하여 변수 (예 :)에 저장할 수 RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;있습니다. 스크립트 실행 방법을 변경할 수도 있습니다. 일반적으로 함수와 별칭은 상속되지 않으며, 그렇지 않으면 항상 스크립트를 중단합니다.
Daniel Beck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.