쉘 키워드를 비활성화하는 방법은 무엇입니까?

쉘 키워드를 비활성화하는 방법은 무엇입니까?

enable내장 명령을 사용하면 echo아래와 같이 셸 내장 명령을 비활성화할 수 있습니다.

enable -n echo

하지만 이와 같은 쉘 키워드를 어떻게 비활성화합니까 time? 시도한다면:

enable -n time

우리는 다음과 같은 "답변"을 얻게 될 것입니다:

bash: enable: time: not a shell builtin

노트: 나는 무엇을 해야 할지 알고 있다뛰어다녔다time/usr/bin, 제목에서 요청한 내용을 수행하는 것이 가능한지 알고 싶습니다.

답변1

넌 할 수있어:

alias time='"time" '

(후행 공백은 보너스로 별칭 확장을 허용하기 위한 것입니다).

키워드(키워드는 셸 언어 구문의 일부임)를 인용하면 해당 키워드가 키워드로 해석되지 않으므로 일반적인 명령 조회가 수행됩니다.

bash, 에서는 작동 하지만 zsh, 또는 에서는 작동 하지 않습니다 .mkshksh93ashyash

비대화형 인스턴스(예: 스크립트)의 경우 다른 셸과 달리 bash비대화형에서는 기본적으로 별칭을 확장할 필요가 없습니다.shopt -s expand_aliasesbash

답변2

당신이 발견했듯이, 당신은 할 수 없습니다장애를 입히다키워드로 enable -n.

그러나 키워드를 기본 제공 키워드로 만든 enable -f다음 비활성화할 수도 있습니다.

  • 현재 버전의 소스코드 압축을 푼다bash
  • ./configure && make
  • 에서는 examples/loadables로드 가능한 내장 함수의 많은 예를 찾을 수 있으며, 그 중 하나를 편집 sync하여 의 모든 인스턴스를 의 하나로 바꾸십시오.synctime
  • 달려가세요.makeexamples/loadables
  • 에서 를 bash실행합니다 enable -f ./sync time.
  • enable -n time이제 괜찮아. 그리고 help다음을 보여줍니다: ( *time제외 time [-p] pipeline)

(누구에게나 효과가 있다는 것은 아닙니다).

답변3

쉘 파서가 찾을 수 없는 경우 키워드를 비활성화하는 대신 호출할 수 있는 경우명령 위치- 또는 간단한 명령의 첫 번째 단어 - 아무 문제 없이 실행할 수 있어야 합니다. POSIX 지정 명령은 command이를 수행하도록 설계되었습니다. 예를 들어 time다음 명령을 호출할 수 있습니다 .

command time

내가 아는 한 이것은 모든 쉘에서 작동합니다. 그런데 이상하게도 많은 사람들이 이 문제를 다른 방식으로 다루는 것 같습니다. 다음은 데모입니다:

echo 'echo "$0"' >./time
chmod +x ./time
for sh in dash ksh zsh bash yash 'busybox ash' posh mksh
do  command -p $sh -c '
    PATH=.:$PATH
    printf "\n%s\n" "$0"
    time
    command time' "$sh"
done 

산출

dash
./time
./time

ksh
user    0m0.00s
sys     0m0.00s
time

zsh
shell  0.00s user 0.00s system 71% cpu 0.005 total
children  0.00s user 0.00s system 0% cpu 0.005 total
time

bash

real    0m0.000s
user    0m0.000s
sys     0m0.000s
./time

yash
./time
./time

busybox ash
./time
./time

posh
./time
./time

mksh
    0m0.00s user     0m0.00s system
./time

답변4

비활성화할 수는 없지만 기능을 사용하여 숨길 수는 있습니다. 자신의 책임하에 사용하십시오.

shell_builtin() {
    :  ## Do nothing.
}

다시 활성화하려면 간단히 설정을 해제하세요.

unset shell_builtin

관련 정보