Bash가 쉘 내장 명령 대신 외부 `time` 명령을 사용하도록 합니다.

Bash가 쉘 내장 명령 대신 외부 `time` 명령을 사용하도록 합니다.

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 rmrmrm -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

관련 정보