每当我尝试执行任何命令时,此命令:“. .bashrc”导致:“-bash:/usr/bin/whoami:参数列表太长”

Ant*_*Ant 1 bash ssh path environment-variables

按照论坛帖子中的说明在外部机器上通过 ssh 安装某些东西时,我不假思索地执行了以下命令:

. .bashrc
Run Code Online (Sandbox Code Playgroud)

我以前从未见过该命令,但我猜测(以前遇到过类似的问题)它会递归获取,~/.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 
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我过去遇到类似问题时(不使用 bash shell 登录ssh -t user@host /bin/sh,然后修改~/.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
Run Code Online (Sandbox Code Playgroud)

ilk*_*chu 6

. .bashrc.bashrc在当前 shell 中运行 的内容。通常,您不需要这样做,因为.bashrc它在启动时被 shell 读取,但是如果您对其进行了修改并想要重新加载它们,您可能会这样做。

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


不过,您在.bashrc, 中的内容有些奇怪:

export PATH=$PATH:$HOME/.local/bin:$HOME/bin/prog1:$PATH
            ^^^^^                                  ^^^^^
Run Code Online (Sandbox Code Playgroud)

注意你是如何把旧的放在新$PATH的开始结束的PATH,五个不同的时间。根据我的统计,这会将原始文件放在$PATH那里 32 次。这还不算太糟糕,但如果在 shell 启动时已经这样做了,那么您$PATH现在将有数千个字符,如果您再次执行相同的操作,它最终可能会远远超过 100 kB。从我$PATH的 74 个字符开始,运行这些分配两次会得到 172 kB 的字符串。

这可能是一个问题:Linux 对单个命令行参数的长度有 128 kB 的限制(除了对整个批次的限制)。环境变量和命令行参数在 上的传递方式类似execve(),因此大概相同的限制适用于两者,因此PATH.


roa*_*ima 5

用这个替换第一组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"
Run Code Online (Sandbox Code Playgroud)

发生的事情是你$PATH在每一行($PATH+新项目+ $PATH)上加倍。很奇怪。

在此替换代码中,每个[[ ... ]]部分在将其添加到您的$PATH. 不是必需的,但肯定更清洁