誤って生成されたzshコマンドを定義解除する方法は?

誤って生成されたzshコマンドを定義解除する方法は?

すべての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; … }されています。私はこれをサポートする他のシェルを知りません。name1name2
  • Zshでは、.関数名を入力できます(例:bash、ダッシュ、またはksh93を除く)。移植可能な関数名には、ASCII文字、数字、下線のみを使用できます。
  • Zsh では、すべてのコマンドを関数本体として使用できます。一部のシェル(特にbash)には複合コマンドが必要です(すべてPOSIX要件)。
    name () { instruction; … }
    
    トピックがグループである最も一般的な形式です。
    name () ( instruction; )
    
    また、移植性に優れ、サブシェルで関数本体を実行します。次のような他の複合コマンドは技術的に有効です。
    name () if condition; then instruction1; else instruction2; fi
    
    POSIX標準に準拠した関数定義ですが、実際には非常にまれです。
    name () echo hello
    
    これはzsh(およびkshとdash)によると完全に有効な関数定義ですが、POSIXまたはbashによるとそうではありません。
  • ()すべてのシェルの前のスペースはオプションです。

効果を元に戻すには、grep .vars() *.py両方の機能をオフにしてください。

unset -f grep .vars

または

unfunction grep .vars

答え3

あなたは機能。これは現在のシェル内でのみ機能します。

簡単な機能は次のとおりです。

f() echo hello

これで、「f」コマンドが挨拶します。

$ f
hello

これをクリアする最も簡単な方法は、unset -fコマンドを使用することです。

あなたの場合:

unset -f grep

関連情報