シェルキーワードを無効にするには?

シェルキーワードを無効にするには?

enable組み込みコマンドを使用すると、echo次のようにシェル組み込みコマンドを無効にできます。

enable -n echo

しかし、このようなシェルキーワードをどのように無効にしますかtime?しようとすると:

enable -n time

私たちは次のような「答え」を得るでしょう:

bash: enable: time: not a shell builtin

ノート:私は何をすべきかを知っています。ジャンプしたtimeつまり/usr/bin、タイトルで要求した内容を行うことが可能かどうか知りたいと思います。

答え1

あなたはできます:

alias time='"time" '

(末尾のスペースはボーナスでエイリアス拡張を許可するためのものです)。

キーワード(キーワードはシェル言語構文の一部です)を引用すると、そのキーワードはキーワードとして解釈されないため、一般的なコマンド検索が行われます。

bash、では動作しますがzsh、またはでは動作しません。mkshksh93ashyash

非対話型インスタンス(スクリプトなど)では、他のシェルとは異なり、非対話型bashではデフォルトでエイリアスを拡張する必要はありません。shopt -s expand_aliasesbash

答え2

あなたが見つけたように、あなたはできません障害を負うキーワードとしてenable -n

ただし、キーワードを組み込みキーワードとして作成してenable -f無効にすることもできます。

  • 現在のバージョンのソースコードを解凍するbash
  • ./configure && make
  • では、examples/loadablesロード可能な組み込み関数の多くの例を見つけることができます。そのうちの1つを編集して、すべてのインスタンスをの1つに置き換えますsyncsynctime
  • 走ってくださいmakeexamples/loadables
  • bash実行しますenable -f ./sync time
  • enable -n time今大丈夫です。そしてhelp以下を示します:(*time除くtime [-p] pipeline

(誰にも効果があるわけではありません)。

答え3

シェルパーサーが見つからない場合キーワードを無効にする代わりに呼び出すことができる場合コマンド位置- または単純なコマンドの最初の単語 - 問題なく実行できる必要があります。 POSIX指定コマンドはcommandこれを行うように設計されています。たとえば、time次のコマンドを呼び出すことができます。

command time

私が知る限り、これはすべてのシェルで動作します。しかし、奇妙なことに、多くの人がこの問題を別の方法で扱っているようです。以下はデモです:

echo 'echo "$0"' >./time
chmod +x ./time
for sh in dash ksh zsh bash yash 'busybox ash' posh mksh
do  command -p $sh -c '
    PATH=.:$PATH
    printf "\n%s\n" "$0"
    time
    command time' "$sh"
done 

出力

dash
./time
./time

ksh
user    0m0.00s
sys     0m0.00s
time

zsh
shell  0.00s user 0.00s system 71% cpu 0.005 total
children  0.00s user 0.00s system 0% cpu 0.005 total
time

bash

real    0m0.000s
user    0m0.000s
sys     0m0.000s
./time

yash
./time
./time

busybox ash
./time
./time

posh
./time
./time

mksh
    0m0.00s user     0m0.00s system
./time

答え4

無効にすることはできませんが、機能を使用して非表示にすることはできます。自分の責任で使用してください。

shell_builtin() {
    :  ## Do nothing.
}

再度有効にするには、単に設定を解除してください。

unset shell_builtin

関連情報