フォーラムの記事の指示に従って、外部コンピュータに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/sh
bashシェルでログインせずに実行後に修正~/.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回の異なる時間。私の計算によると、オリジナルは$PATH
32回出るでしょう。悪くはありませんが、シェルが起動したときにこれを行った場合は、何千もの文字があり$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"
何が起こっているのかは、各行で$PATH
2倍に増加することです($PATH
+新しい項目+)。$PATH
非常に奇妙な。
この代替コードで[[ ... ]]
これを$PATH
。