
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
、またはでは動作しません。mksh
ksh93
ash
yash
非対話型インスタンス(スクリプトなど)では、他のシェルとは異なり、非対話型bash
ではデフォルトでエイリアスを拡張する必要はありません。shopt -s expand_aliases
bash
答え2
あなたが見つけたように、あなたはできません障害を負うキーワードとしてenable -n
。
ただし、キーワードを組み込みキーワードとして作成してenable -f
無効にすることもできます。
- 現在のバージョンのソースコードを解凍する
bash
./configure && make
- では、
examples/loadables
ロード可能な組み込み関数の多くの例を見つけることができます。そのうちの1つを編集して、すべてのインスタンスをの1つに置き換えますsync
。sync
time
- 走ってください
make
。examples/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