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
, 또는 에서는 작동 하지 않습니다 .mksh
ksh93
ash
yash
비대화형 인스턴스(예: 스크립트)의 경우 다른 셸과 달리 bash
비대화형에서는 기본적으로 별칭을 확장할 필요가 없습니다.shopt -s expand_aliases
bash
답변2
당신이 발견했듯이, 당신은 할 수 없습니다장애를 입히다키워드로 enable -n
.
그러나 키워드를 기본 제공 키워드로 만든 enable -f
다음 비활성화할 수도 있습니다.
- 현재 버전의 소스코드 압축을 푼다
bash
./configure && make
- 에서는
examples/loadables
로드 가능한 내장 함수의 많은 예를 찾을 수 있으며, 그 중 하나를 편집sync
하여 의 모든 인스턴스를 의 하나로 바꾸십시오.sync
time
- 달려가세요.
make
examples/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