ZSHのすべてのコマンドに対して「パラメータリストが長すぎます」

ZSHのすべてのコマンドに対して「パラメータリストが長すぎます」

説明がもう少し詳しくなればよかったのですが、しばらく同じArtix設定を使用していますが、自分で修正できない問題はありません。ただし、VirtualBoxをインストールした後(この問題とは無関係だと思います)、再起動後に突然端末からコマンドを実行することはできません。パラメーターの数やパラメーターの数に関係なく、zsh はパラメーターのリストが長すぎると応答します。これは、dwmの実行からlsの使用まで、すべてのジョブで発生します。 .zshrcを最小限にスクラブしてみましたが、何を試しても機能しません。しかし、BashとShellは動作します。どんなアイデアがありますか?

ベストアンサー1

パラメータリストが長すぎます。通常、E2BIG エラーコードに対応するエラーメッセージは次のとおりです。

$ zmodload zsh/system
$ syserror E2BIG
Argument list too long

execve()E2BIG は、引数リストと環境変数文字列の実行が必要なコマンドがサポートされているコマンドより大きい場合、または Linux で単一の引数または環境文字列が 128KiB より大きい場合に返されるエラーコードです。

全体的な制限と方法サイズ計算はシステムによって異なります。最新バージョンのLinuxでは、現在のスタックサイズの制限が原因で発生します。次のように取得できますgetconf ARG_MAX(できると仮定getconf)。

$ getconf ARG_MAX
2097152
$ limit stacksize 1024 # KiB, so 1MiB
$ getconf ARG_MAX
262144

これは少なくとも128KiBですが、スタックサイズ制限の4分の1です(スタックサイズ制限を低く抑えすぎると、さまざまな種類の問題が発生し始めます)。

ここでは、引数リストが小さいコマンドを含むすべてのコマンドでエラーが発生するため、環境変数が非常に大きいか、環境変数とその累積サイズが値に渡されて制限に達したと合理的に想定できます。処刑されたコマンドがARG_MAXより大きい。

たとえば、POSIXオプションを誤って設定して、すべてのシェル変数が環境に配置され、多くの変数が定義されている場合(おそらく一部は他の完了機能を実行して)、これが発生する可能性がallexportあります。隠れ家変数の情報。

調べる:

echo $options[allexport]

報告する必要がありますoff。そうでない場合は、このオプションを設定する開始ファイルを確認してください。set -a、、、、またはオプションのさまざまなスペルset -o allexportにすることができます(大文字と小文字は下書きは無視されるため、たとえば可能性がありsetopt allexportます)。options[allexport]=onsetopt ALL_EXPORT

試してみることができる他のタスクは次のとおりです。

現在のスタックサイズの制限を確認してください。

$ limit stacksize
stacksize       8MB

ARG_MAXの現在の値を確認してください。

$ (typeset +x -m '*'; getconf ARG_MAX)
2097152

typeset +x -m '*'すべての環境変数を削除します。これは含まれていますが、システムではデフォルトでこれを見つけること$PATHができます。getconf$PATH

環境サイズを確認してください。

$ typeset -x | wc -c
4395

(これは近似であり、シェル変数にマップされていない変数は含まれていません。数には、変数値に含まれていない追加の引用符typeset -x文字が含まれる可能性があり、リストも計算する必要はありません。これらの環境文字列へのポインタはサイズです。です。

128KiBより大きい環境変数を探します。

$ LC_ALL=C
$ export test=${(l[132000])}
$ for v (${(k)parameters[(R)*export*]}) {(( (l=${(P)#v}) >= 131071 )) && echo "$v: $l"}
test: 132000
$ ls
ls:2: argument list too long: ls

rootこの問題の影響を受けない別の実行シェルでも、次のことを実行できます。

strace -s150000 -vfe execve -p "$pid"

$pid問題のシェルのプロセスIDはどこにあり(出力を参照echo $$)、そのシェルでコマンドを実行してみてください。

straceexecve()これにより、実行されて失敗した正確なシステムコールと、引数と環境文字列(それぞれ150000バイトに切り捨て)の完全なリストが表示され、E2BIG問題を特定するのに役立ちます。

おすすめ記事