每当我尝试执行任何命令时,此命令:“..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/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 中运行 的内容。通常,您不需要这样做,因为.bashrcshell 在启动时会读取它,但如果您对其进行修改并想要重新加载它们,您可能会这样做。

但在一个交互式 shell 中执行此操作不会影响您稍后登录时启动的其他 shell。


不过,你的内容.bashrc有点奇怪:

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

注意你是如何把旧的$PATH放在开始的新的结束PATH,五个不同的时间。据我统计,原件将$PATH出现 32 次。这还不错,但如果在 shell 启动时就这样做了,那么$PATH现在将有数千个字符,如果您再次执行相同的操作,则最终可能会远远超过 100 kB。从$PATH74 个字符开始,运行这些分配两次会得到 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.不是必需的,但肯定更干净

相关内容