すべてのPythonファイルで文字列 ".vars()"を検索したいとし、どういうわけか "grep"を次のようにオーバーライドしました。
% grep .vars() *.py
% which grep
grep () {
*.py
}
この問題を使用unset grep
して修正しようとしましたが、成功しませんでした。export grep=/bin/grep
私が誤ってやったことを誰か説明してもらえますか?
注:Bashでは、次のように失敗します。
「予期しない表示」( '」の近くに構文エラーがあります。
答え1
これには2つの関数が定義されています。 1つは名前が付けられ、grep
もう1つは名前が付けられますvars
。*.py
grep .vars() *.py
これらの機能を削除してシャドウをキャンセルするには、次の手順を実行するgrep
必要があります。
$ unset -f grep .vars
からman zshbuiltins
:
unset [ -fmv ] name ... ... unset -f is equivalent to unfunction. ... unfunction Same as unhash -f. ... unhash ... The -f option causes unhash to remove shell functions.
答え2
これは関数定義です。より正確には、同じコードで2つの関数を定義することです。 zshには、関数定義の基本構文に対する複数の拡張があるため、奇妙に見えますname () { instruction; … }
。
- Zshは複数の名前を受け入れます。関数と同じ本体が定義
name1 name2 () { instruction; … }
されています。私はこれをサポートする他のシェルを知りません。name1
name2
- Zshでは、
.
関数名を入力できます(例:bash、ダッシュ、またはksh93を除く)。移植可能な関数名には、ASCII文字、数字、下線のみを使用できます。 - Zsh では、すべてのコマンドを関数本体として使用できます。一部のシェル(特にbash)には複合コマンドが必要です(すべてPOSIX要件)。
トピックがグループである最も一般的な形式です。name () { instruction; … }
また、移植性に優れ、サブシェルで関数本体を実行します。次のような他の複合コマンドは技術的に有効です。name () ( instruction; )
POSIX標準に準拠した関数定義ですが、実際には非常にまれです。name () if condition; then instruction1; else instruction2; fi
これはzsh(およびkshとdash)によると完全に有効な関数定義ですが、POSIXまたはbashによるとそうではありません。name () echo hello
()
すべてのシェルの前のスペースはオプションです。
効果を元に戻すには、grep .vars() *.py
両方の機能をオフにしてください。
unset -f grep .vars
または
unfunction grep .vars
答え3
あなたは機能。これは現在のシェル内でのみ機能します。
簡単な機能は次のとおりです。
f() echo hello
これで、「f」コマンドが挨拶します。
$ f
hello
これをクリアする最も簡単な方法は、unset -f
コマンドを使用することです。
あなたの場合:
unset -f grep