每當我嘗試執行任何命令時,此命令:“..bashrc”都會導致:“-bash: /usr/bin/whoami: Argument list too long”
在按照論壇文章中的說明在外部機器上通過 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 shell 登錄),我無法解決問題,~/.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
用這個替換第一組
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
在每一行都加倍($PATH
+新項目+$PATH
)。很奇怪。在此替換程式碼中,每個
[[ ... ]]
部分都確保相應的目錄存在,然後再將其添加到您的$PATH
. 不是必需的,但肯定更清潔
. .bashrc
將.bashrc
在目前 shell 中執行 的內容。通常,您不需要這樣做,因為.bashrc
shell 在啟動時會讀取它,但如果您對其進行修改並想要重新載入它們,您可能會這樣做。但是在一個互動式 shell 中執行此操作不應影響您在以後登錄時啟動的其他 shell。
但是,您在其中的
.bashrc
內容有些奇怪:export PATH=$PATH:$HOME/.local/bin:$HOME/bin/prog1:$PATH ^^^^^ ^^^^^
請注意您如何將 old 放在new
$PATH
的開頭和結尾PATH
,五個不同的時間。據我計算,這會將原件放在$PATH
那裡 32 次。這還不算太糟糕,但是如果在 shell 啟動時已經這樣做了,那麼你$PATH
現在將有數千個字元,如果你再做同樣的事情,它最終可能會遠遠超過 100 kB。從我$PATH
的 74 個字元開始,執行這些任務兩次會得到一個 172 kB 的字元串。這可能是一個問題:Linux 對單個命令行參數的長度有 128 kB 的限制(除了整個參數的限制)。環境變數和命令行參數在 上以類似方式傳遞
execve()
,因此大概相同的限制適用於兩者,因此PATH
.