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使用されます。cdcd

答え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

関連情報