当按照论坛帖子中的说明通过 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
答案1
. .bashrc
.bashrc
将在当前 shell 中运行 的内容。通常,您不需要这样做,因为.bashrc
shell 在启动时会读取它,但如果您对其进行修改并想要重新加载它们,您可能会这样做。
但在一个交互式 shell 中执行此操作不会影响您稍后登录时启动的其他 shell。
不过,你的内容.bashrc
有点奇怪:
export PATH=$PATH:$HOME/.local/bin:$HOME/bin/prog1:$PATH
^^^^^ ^^^^^
注意你是如何把旧的$PATH
放在开始的和新的结束PATH
,五个不同的时间。据我统计,原件将$PATH
出现 32 次。这还不错,但如果在 shell 启动时就这样做了,那么$PATH
现在将有数千个字符,如果您再次执行相同的操作,则最终可能会远远超过 100 kB。从$PATH
74 个字符开始,运行这些分配两次会得到 172 kB 的字符串。
这可能是一个问题:Linux 对单个命令行参数的长度有 128 kB 的限制(此外还有对整个命令行参数的限制)。环境变量和命令行参数在 上的传递方式类似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
在每一行都加倍了($PATH
+新项目+ $PATH
)。很奇怪。
在此替换代码中,每个[[ ... ]]
部分在将其添加到您的$PATH
.不是必需的,但肯定更干净