コマンドを実行しようとするたびに、「..bashrc」コマンドは「-bash: /usr/bin/whoami: 引数のリストが長すぎます」という結果になります。

コマンドを実行しようとするたびに、「..bashrc」コマンドは「-bash: /usr/bin/whoami: 引数のリストが長すぎます」という結果になります。

フォーラムの記事の指示に従って、外部コンピュータにSSHを介して何かをインストールするときに何も考えずに次のコマンドを実行しました。

. .bashrc

以前にこのコマンドを見たことはありませんが、~/.bashrc今はどのコマンドも実行できないため(以前に同様の問題があったため)、このコマンドが再帰的にソースになったと推測します。ログインすると何もできません。すぐに私は次のようになります。

-bash: /usr/bin/whoami: Argument list too long
-bash: /usr/bin/cut: Argument list too long
-bash: /usr/bin/logger: Argument list too long 

残念ながら、過去に同様の問題が発生した場合(ssh -t user@host /bin/shbashシェルでログインせずに実行後に修正~/.bashrc)、問題に対する解決策が見つかりませんでした。なぜなら~/.bashrc…以前と同じように見えたからです。めちゃくちゃになる

私が何をしても、修正は~/.bashrc解決策ではないようです。誰でも代替ソリューションを提案できますか?


これは~/.bashrc

# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
       . /etc/bashrc
fi

export PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH=$PATH:$HOME/.local/bin:$HOME/bin/prog1:$PATH
export PATH=$PATH:$HOME/.local/bin:$HOME/bin/prog2:$PATH
export PATH=$PATH:$HOME/.local/bin:$HOME/prog2:$PATH
export PATH=$PATH:$HOME/.local/bin:$HOME/prog2/bin:$PATH
export PATH=$PATH:$HOME/.local/bin:$HOME/bin/prog3/tools/newtool:$PATH

export PYTHONPATH=$PATH:$HOME/.local/bin:$HOME/prog2:$PYTHONPATH

答え1

. .bashrc.bashrc現在のシェルで実行される内容です。通常、シェルの起動時にこれを読み取るため、これを行う必要はありませんが、.bashrc変更して再ロードしたい場合はこれを行うことができます。

ただし、対話型シェルでこれを実行しても、後でログインしたときに開始する他のシェルには影響しません。


ところが内容が.bashrcちょっと変です。

export PATH=$PATH:$HOME/.local/bin:$HOME/bin/prog1:$PATH
            ^^^^^                                  ^^^^^

$PATH最初に古いものを入れる方法に注意してくださいそして新しいエンディングPATH、5回の異なる時間。私の計算によると、オリジナルは$PATH32回出るでしょう。悪くはありませんが、シェルが起動したときにこれを行った場合は、何千もの文字があり$PATHます。 74文字から始めて$PATHこれらの割り当てを2回実行すると、172kBの文字列が生成されます。

これは問題になる可能性があります。 Linuxでは、単一のコマンドライン引数の長さの制限は128kBです(完全なコマンドライン引数の制限に加えて)。環境変数とコマンドライン引数はで同様に渡されるので、execve()おそらく両方に同じ制限が適用されますPATH

答え2

export最初の行セットをこれに置き換えます。

export PATH="$PATH:$HOME/.local/bin:$HOME/bin"
[[ -d "$HOME/bin/prog1" ]] && PATH="$PATH:$HOME/bin/prog1"
[[ -d "$HOME/bin/prog2" ]] && PATH="$PATH:$HOME/bin/prog2"
[[ -d "$HOME/prog2" ]] && PATH="$PATH:$HOME/prog2"
[[ -d "$HOME/prog2/bin" ]] && PATH="$PATH:$HOME/prog2/bin"
[[ -d "$HOME/bin/prog3/tools/newtool" ]] && PATH="$PATH:$HOME/bin/prog3/tools/newtool"

何が起こっているのかは、各行で$PATH2倍に増加することです($PATH+新しい項目+)。$PATH非常に奇妙な。

この代替コードで[[ ... ]]これを$PATH

関連情報