関数がどこかで宣言されていて、その関数の名前が「cp」であるため、通常のcpの動作をオーバーライドしているzshシェルにこの厄介な問題があります。関数宣言を見つけようとしていますが、見つかりません。私はすでに.zshrcの通常の場所と、.zshrcに含まれている他のさまざまなソースを調べましたが、今のところ何もありません。
私が試した他のこと:
grep -r 'function cp' .
(〜から)whence -f cp
(関数定義を提供しますが、宣言元は提供しません)何か案は?
まず第一に、関数はfunction
キーワードなしで定義できるので、より良い検索は
grep 'cp()' .*
これにより、.zshrc
や.profile
などのファイルが検索されます。それでも何も見つからない場合は、zsh
によってロードされたさまざまなファイルを確認することもできます。これらはman zsh
の最後にリストされています。
FILES
$ZDOTDIR/.zshenv
$ZDOTDIR/.zprofile
$ZDOTDIR/.zshrc
$ZDOTDIR/.zlogin
$ZDOTDIR/.zlogout
${TMPPREFIX}* (default is /tmp/zsh*)
/etc/zsh/zshenv
/etc/zsh/zprofile
/etc/zsh/zshrc
/etc/zsh/zlogin
/etc/zsh/zlogout (installation-specific - /etc is the default)
デフォルトでは、$ZDOTDIR
を$HOME
にする必要があります。したがって、このコマンドは問題のあるファイルを見つける必要があります。
grep 'cp()\|cp ()' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin /etc/zsh/zshenv \
/etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin
関数名と関数自体の間にスペースを入れることもできるので、\|
を追加しました。最後に、 @ Dennisが指摘function
キーワードを使用する場合は、括弧も省略できます。したがって、さらに安全にするために、これを実行します。
grep -E 'function cp|cp *\(\)' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin \
/etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin
私は今日これをする必要があり、それを見つけましたwhence -v
関数定義を含むファイルを出力します。
$ whence -v function_name
function_name is a Shell function from /path/to/file
新しいバージョンのzsh(5.4以降、コミットで追加 34f70c5
)は、$functions_source
モジュールの一部としてzsh/parameter
配列をサポートします(ドキュメント:man zshmodules
)::
functions_source
この読み取り専用の連想配列は、有効な関数の名前を、関数のソースを含むファイルの名前にマップします。
すでにロードされているか、絶対パスで自動ロードのマークが付けられている、またはパスが「
functions -r
」で解決されている自動ロードされた関数の場合、これは自動ロードで見つかったファイルであり、絶対パスに解決されます。スクリプトまたはソースファイルの本体内で定義された関数の場合、これはそのファイルの名前です。この場合、これはそのファイルに最初に使用された正確なパスであり、相対パスである可能性があります。
対話型プロンプトで定義された関数や、パスがまだ解決されていない自動ロード関数を含むその他の関数の場合、これは空の文字列です。ただし、ハッシュ要素は、関数が存在する限り、定義されたとおりに報告されます。このハッシュのキーは、
$funcions
のキーと同じです。
だから、あなたはすることができます
echo $functions_source[cp]
Terdonの答え 関数定義のすべての可能なバリアントをキャッチするための適切なgrep
コマンドがすでに提供されています。
もう2点付け加えたいと思います。
実際に読み込まれているファイルのリストを取得するには(たとえば、非標準ファイルは別のファイルから供給されている可能性があります!)、zsh
を呼び出すことができます。とともに SOURCE_TRACE
オプションが有効:
$ zsh -o sourcetrace
+/etc/zshenv:1> <sourcetrace>
+/home/user/.zshrc:1> <sourcetrace>
+/home/user/.zcompdump:1> <sourcetrace>
+/home/user/.zshrc-last:1> <sourcetrace>
この, grep-approach ''を使用すると、autoload
ビルトインを介してautoloadedされている関数をキャッチできません。したがって、fpath
もチェックしてください。
$ for i ($fpath) { ls -l "$i"/cp }