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
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
を使用して実際の機能を実行します。
パスを指定したり、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
組み込み(テストなど)の一般的なソリューションは次のとおりです。 [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\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
がエイリアスされている場合でも、\test
はPATHコマンド(または無効になっていない場合は組み込み)を実行します。
組み込みcommand
を使用します(これは組み込みでは機能しません):
$ command time
上記の組み込みのように、スラッシュを使用すると/
が機能します。
$ /usr/bin/time
上記の組み込みの場合と同様に、エイリアスもここで機能します。
$ alias time='command time'
$ alias time='/usr/bin/time'
[1]「外部テスト」を出力する~/bin/test
に外部実行可能ファイルがあると仮定します。さらに、アクティブなPATHで~/bin
が/bin
よりも先にあると仮定します。
enable
コマンドを使用して、特定の組み込みを無効にすることができます。
$ enable -n kill
ただし、time
はキーワードなので、これは機能しません。
$ builtin time
bash: builtin: time: not a Shell builtin
したがって、それをオーバーライドするエイリアスを作成する必要があります。
$ alias time=/usr/bin/time
これを~/.bashrc
にドロップしてください:
alias time=/usr/bin/time