複数の端末で使用しているときに自分の記録を上書きするので、その機能をオフにしたいと思いますfc -W
。残念ながら、私はタイピングをたくさんする習慣があります。
エイリアスを作成することは不可能だと思いますfc -W
。
だから私は次のような関数を作ってみました。
# Make sure to never invoke fc -W
fc(){
for x; do
if [[ "${x}" == -W ]]; then
echo "I'm sorry Dave. I'm afraid I can't do that."
return
fi
done
fc "${@}"
}
しかし、今度は呼び出しfc "${@}"
が独自に呼び出され、無限の再帰が発生します。通常、私は/usr/bin/fc
代わりにegを使ってこれを避けます。fc
しかし:
$ type fc
> fc is a shell builtin
この場合、無限再帰を避ける方法は何ですか?または、コマンドのフラグを無効にするより良い方法はありますか?
答え1
使用builtin
:
builtin fc "$@"
これにより、組み込みfc
コマンドが呼び出されます。
スタイル:診断メッセージは標準エラーストリームに送信され、関数は失敗時にゼロ以外の状態を返す必要があります。
echo 'Sorry, can not do that' >&2
return 1
答え2
エイリアスを使用して、組み込みコマンド、外部コマンド、または関数をオーバーライドできます。同じ名前のエイリアスは、エイリアスの実行時に拡張されません。したがって、エイリアス拡張でエイリアス名を使用すると、同じ名前の組み込みまたは外部コマンドまたは関数が呼び出されます。これは、単純な方法でエイリアスを使用してコマンドに追加のオプションを渡すことができることを意味します。ただし、エイリアス拡張がどのように機能するかによって、より多くのことを行うことはできません。単なる言葉の置き換えに過ぎず、評価は必要ありません。
関数を使用して、組み込みコマンドまたは外部コマンドをオーバーライドできます。特定の名前の関数が現在実行されているという事実は、実行に影響を与えず、特に関数名の意味には影響しません。常にその関数を参照してください。再帰関数はシェルプログラミングでは一般的ではありませんが、そのための規則はありません。
command
POSIXシェルでは、呼び出しの前に名前を付けることで、組み込みまたは外部コマンドを強制的に引用できます。つまり、command
エイリアスと関数をバイパスします。 zshでは、command
外部コマンド呼び出しが強制されます(posix_builtins
このオプションが設定されていない場合)。つまり、組み込みコマンドも無視します。 zshで組み込み関数を強制的に実行するには、builtin
組み込み関数を使用してください。
これは解決策につながります。ラッパー関数でbuiltin fc
代わりに呼び出してくださいfc
。
fc
しかし、これは必ずしも状況に最適な解決策ではありません。これは、他の関数の呼び出しを含む関数がどこでも呼び出されるためです。組み込みの動作をオーバーライドする場合は、エイリアスを使用することをお勧めします。エイリアスは、ロードされた関数(関数の自動ロードに推奨される方法)ではなく、コマンドラインに入力またはロードする項目.
(別名)にのみ適用されます。したがって、ラッパー関数を呼び出すエイリアスを定義し、ラッパー関数に別の名前を付けます。source
autoload -U
fc
fc_wrapper () {
for x; do
if [[ "${x}" == -*W* ]]; then
echo >&2 "I'm sorry Dave. I'm afraid I can't do that."
return 1
fi
done
\fc "${@}"
}
alias fc=fc_wrapper
関数定義に\fc
置換を入れました。fc
エイリアス定義の前に定義をロードする場合は必要ありませんが.zshrc
、たとえば対話型セッション中に関数定義を編集または再ロードする場合は必要です。また、機能を少し改善しました。
- エラーメッセージを標準エラーとして出力します。
- 操作が完了していない場合はエラー状態を返します。
- こうした事件も摘発された
fc -WI
。fc -R -- -W
(read History from file names)のような呼び出しもキャプチャするので、完全に信頼できませんが、-W
このユースケースには十分です。