linux – 即使正确指定$PATH,为什么Bash无法找到命令?

我在文件/ etc / profile中指定了我的命令的路径:

export PATH=$PATH:/usr/app/cpn/bin

我的命令位于:

$which ydisplay 
/usr/app/cpn/bin/ydisplay

所以,当我执行“echo $PATH”输出时看起来像:

$echo $PATH
...:/usr/app/cpn/bin

一切都很好,但当我试图通过SSH启动我的命令时,我收到错误:

$ssh 127.0.0.1 ydisplay
$bash: ydisplay: command not found

但我的道路仍然存在:

$ssh 127.0.0.1 echo $PATH
...:/usr/app/cpn/bin

请解释一下为什么Bash无法在SSH会话期间找到ydisplay以及如何正确配置SSH以避免此问题.

更重要的是,如果我在当前用户的本地文件.bashrc中指定$PATH都能正常工作.但我想只修改一个文件,而是为每个用户指定很多文件.这就是我要问的原因.

最佳答案
TL;博士

运行ssh 127.0.0.1 ydisplay源〜/ .bashrc而不是/ etc / profile.改为在〜/ .bashrc中改变你的路径.

细节

只读/ etc / profile是你的shell是“登录shell”的时候.

Bash Reference Manual

When bash is invoked as a login shell, … it first reads and executes commands from the file /etc/profile

但是当你运行ssh 127.0.0.1 ydisplay时,bash不会作为登录shell启动.但它确实读取了不同的启动文件. Bash Reference Manual说:

when … executed by … sshd. … it reads and executes commands from ~/.bashrc

所以你应该把你的PATH设置放在〜/ .bashrc中.

在大多数系统上,〜/ .bash_profile源〜/ .bashrc,因此您只能将设置放在〜/ .bashrc中,而不是将它们放在两个文件中.

没有标准的方法来更改所有用户的设置,但大多数系统都有/ etc / bashrc,/ etc / bash.bashrc或类似的.

如果失败,请设置pam_env并将PATH设置放在/ etc / environment中.

也可以看看:

> What’s the conf file reading between login and non-login shell?
> Is there a “.bashrc” equivalent file read by all shells?

转载注明原文:linux – 即使正确指定$PATH,为什么Bash无法找到命令? - 代码日志