シェル機能である一部のシェルコマンドが常に利用できないのはなぜですか?

シェル機能である一部のシェルコマンドが常に利用できないのはなぜですか?

historyzshを使用してEmacsで実行するとコマンドが使用できないことがわかりましたshell-command

history | grep runserver明らかになるzsh:fc:1: no such event: 1

私もhistdb次のコマンドを使用します。https://github.com/larkery/zsh-histdbこのコマンドはzshで使用できますが、Emacsでは呼び出すことはできません。

histdb --limit 2000 | grep runserver出力zsh:1: command not found: histdb

明らかに私はシェルの重要な側面を理解していません。

これらの問題を解決するには何が必要ですか?

この現象はEmacsにのみ存在するものではありません。たとえば、リモートsshコマンドを実行すると、同じエラーメッセージが表示されます。ssh [email protected] 'histdb --limit 2000'

答え1

私のzshにはコマンドがないので、組み込みhistdbコマンドではなく実際に関数であると仮定する必要があります。

シェル機能はソーススクリプト(通常はプライベート初期化スクリプトまたはシステムレベルの初期化スクリプト)からロードされます。これらのスクリプトが複数あり、すべての場合で実行されるわけではないため、誤ったスクリプトに関数を定義すると、場合によってはその関数を使用できないことがあります。

また、initスクリプトはシェルが実行されている環境を検出し、条件に応じてコンポーネントをロードできます。おそらく、何らかの理由でemacsでzshを実行すると、emacsの外部で実行したときに得られるすべての機能がロードされない可能性があります。

確実にするには、関数がどのファイルからロードされたのか、そしてそのファイルの定義の前に条件付きコードがあるかどうかを知る必要があります。

関連情報