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

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



답변

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를 사용 하여 실제 작업을 수행 한다고 언급합니다 .


답변

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


답변

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

  • 사용 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하십시오.


답변

이것을 당신의 ~/.bashrc:

alias time=/usr/bin/time


답변

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

$ enable -n kill

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

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

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

$ alias time=/usr/bin/time


답변