bash가 쉘 내장 대신 외부`time` 명령을 사용하게하십시오.


27

bash가 쉘 키워드 대신 기본적으로 바이너리 (/ usr / bin / time)를 사용하게하려면 어떻게해야합니까?

which timeReturns /usr/bin/time
type timeReturns time is a shell keyword
Running 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

답변:


30

command쉘 내장을 사용하여 일반 조회 프로세스를 무시하고 다른 가능성 (쉘 내장, 별명 등)에 관계없이 지정된 명령을 외부 명령으로 실행할 수 있습니다. 또이 문제는 아마 더 일반적으로 속기를 사용하지만, 시스템에서 휴대 할 필요가 스크립트에서 이루어집니다 \(같이 \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를 사용 하여 실제 작업을 수행 한다고 언급합니다 .


명령을 사용하여 특정 명령이 어디에서 나오는지 문의 할 수도 있습니다 type -a <cmd>.
slm

12
command내장을 우회하지 않습니다 ( zsh다른 쉘을 모방하지 않는 경우 제외 ). 그것은 기능을 우회하며 그것이 존재하는 주된 이유입니다. 두 번째 역할은 제거하는 것입니다 특별한특수 내장 명령 . 별칭과 키워드는 첫 번째 위치에서만 확장되므로 별칭과 키워드 만 무시합니다 ( zsh예 : 전역 별칭을 무시하지 않음). timebash 내장 이 없습니다 . time예를 들어 키워드 time { foo; bar; }입니다.
Stéphane Chazelas

1
@StephaneChazelas 더 정확한 설명을 제공하기 위해 답을 수정하여 자유롭게 편집하십시오. command예를 들어이 특정 경우에 작동하지만 분명히 정답은 반 정답보다 낫습니다.
CVn

1
답의 마지막 부분이 잘못되었습니다. 시간은 쉘 내장이 아니라 쉘 키워드입니다. builtin time작동하지 않습니다.
Teresa e Junior

명령과 비슷하게 인용 'time' echo test
만하면

9

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

8
참고가 만드는 인용 또는 아무것도 어떤 형태의 것을 하지 토큰 time할 것입니다은 : ti\me, 'time', ti""me, ti${-##*}me, ${-+time}... 그 어떤 쉘 키워드에 적용됩니다.
Stéphane Chazelas

내가 본 최고의 PS1
maxywb

1
@maxywb 또한, 그것은 단지 장식적인 것이 아닙니다 – 마지막 명령이 실패하면, 행복한 얼굴이 빨갛게 변합니다(x_x)
Izkata

4

내장 (예 : 테스트)에 대한 일반적인 솔루션은 다음과 같습니다.

  • 사용 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별칭이 있더라도 \testPATH 명령 (또는 비활성화되지 않은 경우 내장)을 실행합니다.

  • 내장을 사용하십시오 (내장 command에서는 작동하지 않음).

    $ command time
  • 내장의 경우 위와 같이 슬래시를 사용하십시오 /.

    $ /usr/bin/time
  • 내장의 경우 위와 같이 별명도 작동합니다.

    $ alias time='command time'
    $ alias time='/usr/bin/time'
    

[1] ~/bin/test"외부 테스트"를 출력 하는 외부 실행 파일이 있다고 가정 합니다. 그리고 추가 : 활성 PATH ~/bin보다 앞서 있다고 가정 /bin하십시오.



2

enable명령을 사용하여 특정 내장 기능을 비활성화 할 수 있습니다 .

$ enable -n kill

그러나 time키워드이므로 작동하지 않습니다.

$ builtin time
bash: builtin: time: not a shell builtin

따라서 별칭을 재정의하기 위해 별칭을 만들었습니다.

$ alias time=/usr/bin/time

아니. time은 쉘 내장 키워드가 아닌 쉘 키워드입니다. 응답을 보았을 때 enable -n이 작동하지 않는다고 말하는 내 질문을 편집하려고했습니다.
David Holdeman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.