web-dev-qa-db-ja.com

シェル組み込みではなく、外部の `time`コマンドをbashに使用させる

Shellキーワードの代わりに、デフォルトでbashに時間バイナリ(/ usr/bin/time)を使用させるにはどうすればよいですか?

which time 戻り値 /usr/bin/time
type time 戻り値 time is a Shell keyword
実行中のtimeは明らかにShellキーワードを実行しています:

$ 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

27
David Holdeman

command Shellビルトインを使用して、通常のルックアッププロセスをバイパスし、他の可能性(シェルビルトイン、エイリアスなど)に関係なく、指定したコマンドを外部コマンドとして実行できます。これは多くの場合、システム間で移植可能である必要があるスクリプトで行われますが、おそらくより一般的には\\rmまたはrmではなくcommand 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のmanページでは、これは、カスタムcd機能にcdという名前の関数を提供するためによく使用されると記載されています。この関数は、組み込みcdを使用して実際の機能を実行します。

30
a CVn

パスを指定したり、commandのような別の組み込み関数を使用したりする必要なく、bashにはサイドステップキーワードへのショートカットがあります。バックスラッシュでエスケープします。

=^_^= 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
9
Izkata

組み込み(テストなど)の一般的なソリューションは次のとおりです。 [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
    

しかし、時間は組み込みではありません。

Word timeは「予約済みの単語」であり、コマンドでも組み込みでもありません。これにより、このソリューションが可能になります。

  • 言葉を引用する。これは組み込みでは機能しません。
    多くの引用作業形式:\time"time"'time'ti\meti"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がエイリアスされている場合でも、\testはPATHコマンド(または無効になっていない場合は組み込み)を実行します。

  • 組み込みcommandを使用します(これは組み込みでは機能しません):

    $ command time
    
  • 上記の組み込みのように、スラッシュを使用すると/が機能します。

    $ /usr/bin/time
    
  • 上記の組み込みの場合と同様に、エイリアスもここで機能します。

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

[1]「外部テスト」を出力する~/bin/testに外部実行可能ファイルがあると仮定します。さらに、アクティブなPATHで~/bin/binよりも先にあると仮定します。

4
user79743

enableコマンドを使用して、特定の組み込みを無効にすることができます。

$ enable -n kill

ただし、timeはキーワードなので、これは機能しません。

$ builtin time
bash: builtin: time: not a Shell builtin

したがって、それをオーバーライドするエイリアスを作成する必要があります。

$ alias time=/usr/bin/time
2
slm

これを~/.bashrcにドロップしてください:

alias time=/usr/bin/time

2
TravisThomas