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