bash가 쉘 키워드 대신 기본적으로 시간 바이너리(/usr/bin/time)를 사용하도록 하려면 어떻게 해야 합니까?
which time
반환 /usr/bin/time
type time
반환 time is a shell keyword
실행은 time
분명히 쉘 키워드를 실행하고 있습니다.
$ time
real 0m0.000s
user 0m0.000s
sys 0m0.000s
$ /usr/bin/time
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
enable -n time
반품bash: enable: time: not a shell builtin
답변1
쉘 내장 기능을 사용하면 command
일반적인 조회 프로세스를 우회하고 다른 가능성(쉘 내장 기능, 별칭 등)에 관계없이 특정 명령을 외부 명령으로 실행할 수 있습니다. 이는 일반적으로 시스템 간에 이식 가능해야 하는 스크립트에서 수행됩니다. 단, 약칭을 사용하는 것이 더 일반적일 수 있습니다 \
(예: or \rm
대신 , 특히 후자가 와 같이 알려지지 않은 항목에 별칭을 지정할 수 있기 때문 ).command rm
rm
rm -i
$ time
real 0m0.000s
user 0m0.000s
sys 0m0.000s
$ command time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
다음과 같이 별칭과 함께 사용할 수 있습니다.
$ alias time='command time'
$ time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
예를 들어 , 바이너리에 대한 전체 경로를 alias time=/usr/bin/time
지정하지 않고 일반적인 경로 검색 메커니즘으로 대체한다는 장점이 있습니다.time
명령 alias
자체는 예를 들어 ~/.bashrc 또는 /etc/bash.bashrc에 들어갈 수 있습니다(후자는 시스템의 모든 사용자에게 전역적입니다).
반대의 경우(별칭이 정의된 경우 내장 쉘을 강제로 사용하기 위해) 다음과 같은 것을 사용할 수 있습니다. builtin time
이는 일반적인 검색 프로세스를 다시 무시하고 지정된 내장 쉘을 실행합니다. Bash 매뉴얼 페이지에서는 이것이 일반적으로 cd
라는 함수를 통해 사용자 정의 기능을 제공하는 데 사용되며 cd
, 이 함수는 내장 함수를 사용하여 cd
실제 작업을 수행한다고 언급합니다.
답변2
bash에는 경로를 지정하지 않거나 다른 내장 명령을 사용하지 않고 키워드를 이스케이프하는 단축키가 있습니다(예: command
백슬래시로 이스케이프 처리).
=^_^= izkata@Izein:~$ time
real 0m0.000s
user 0m0.000s
sys 0m0.000s
=^_^= izkata@Izein:~$ \time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
개인적으로 나는 이것이 가능하기 때문에 더 읽기 쉽고 안전하다고 생각합니다.
=^_^= izkata@Izein:~$ alias command=echo
=^_^= izkata@Izein:~$ command time
time
답변3
내장 함수(예: 테스트)에 대한 일반적인 솔루션은 [1] 입니다 .
사용
env
(모든 쉘)$ env test external test
내장 기능을 비활성화합니다(bash 및 zsh에만 해당):
$ test 1 = 1 && echo "yes" yes $ enable -n test ### for bash. Re-enable with "enable test". $ disable test ### for zsh. Re-enable with "enable test". $ test external test
슬래시
/
(모든 쉘)를 사용하여 명령을 호출하십시오.$ test 1 = 1 && echo "yes" yes $ ~/bin/test external test
별칭 만들기(
shopt -s expand_aliases
사용하지 않는 한 bash 스크립트에서 실패함):$ alias test='~/bin/test' ### remove with 'unalias test'. $ test external test
그러나 시간은 본질적인 것이 아닙니다.
이 단어는 time
명령도 아니고 내장 단어도 아닌 "예약어"입니다. 이 솔루션을 활성화하십시오:
단어를 인용해 보세요. 이는 내장 프로그램에는 적용되지 않습니다.
다양한 형태의 인용저작물\time
"time"
'time'
ti\me
ti"me"
등$ time real 0m0.000s user 0m0.000s sys 0m0.000s $ \time Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose] [--portability] [--format=format] [--output=file] [--version] [--quiet] [--help] command [arg...]
이는 별칭을 우회하는 데 유용합니다.
test
별칭이 있어도 PATH\test
명령(또는 아직 비활성화되지 않은 경우 내장 명령)이 실행됩니다.내장 함수 사용
command
(내장 함수에서는 작동하지 않음):$ command time
위의 내장 함수와 마찬가지로 모든 슬래시가 작동합니다
/
.$ /usr/bin/time
위의 내장 함수와 마찬가지로 여기에서도 별칭을 사용할 수 있습니다.
$ alias time='command time' $ alias time='/usr/bin/time'
~/bin/test
[1] "외부 테스트"를 인쇄하는 외부 실행 파일이 있다고 가정합니다 . 한 단계 더 나아가서 활성 경로에서 ~/bin
앞서 있다고 가정합니다./bin
답변4
이 enable
명령을 사용하여 특정 내장 명령을 비활성화할 수 있습니다.
$ enable -n kill
그러나 이것은 time
키워드이므로 작동하지 않습니다.
$ builtin time
bash: builtin: time: not a shell builtin
따라서 이를 재정의하려면 별칭을 만들어야 합니다.
$ alias time=/usr/bin/time