Bash

每當我嘗試執行任何命令時,此命令:“..bashrc”都會導致:“-bash: /usr/bin/whoami: Argument list too long”

  • May 6, 2021

在按照論壇文章中的說明在外部機器上通過 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 中執行 的內容。通常,您不需要這樣做,因為.bashrcshell 在啟動時會讀取它,但如果您對其進行修改並想要重新載入它們,您可能會這樣做。

但是在一個互動式 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.

引用自:https://unix.stackexchange.com/questions/648319