为什么我的 $PATH 在执行的脚本中不同?

Blu*_*lub 4 zsh

在 gnome 终端内回显 $PATH:

/home/pc/less.js/bin:/home/pc/local/bin:/home/pc/local/bin:/home/pc/.rvm/gems/ruby-1.9.2-head/bin:/ home/pc/.rvm/gems/ruby-1.9.2-head@global/bin:/home/pc/.rvm/rubies/ruby-1.9.2-head/bin:/home/pc/.rvm/bin :/usr/local/bin:/home/pc/local/bin:/usr/lib64/mp​​i/gcc/openmpi/bin:/home/pc/bin:/usr/local/bin:/usr/bin:/ bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib64/jvm/jre/bin:/home/pc/Programming/Software/tup:/home/pc/Programming/库/仓库工具:/home/pc/Programming/Libraries/apache-maven-3.0.4/bin

从这个脚本内部:

#!/bin/zsh
echo $PATH
while inotifywait -e modify /home/pc/vbox-shared/less; do
    lessc custom.less > /home/pc/vbox-shared/less/custom.css
done
Run Code Online (Sandbox Code Playgroud)

/usr/lib64/mp​​i/gcc/openmpi/bin:/home/pc/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/ usr/游戏:/usr/lib64/jvm/jre/bin

正如你所看到的,我.zshrc用这个修改了我的文件:

导出路径=/home/pc/less.js/bin:$PATH

为什么它在作为文件执行时在脚本中不起作用?问题是没有找到 lessc 命令。

Dan*_*eck 5

该脚本使用 运行/bin/zsh,它不是交互式或登录 shell,并且不会加载此文件。从man zsh,强调我的:

命令首先从 /etc/zshenv 读取;这不能被覆盖。后续行为由 RCS 和 GLOBAL_RCS 选项修改;前者影响所有启动文件,而后者只影响全局启动文件(此处显示的路径以 / 开头)。如果在任何时候未设置其中一个选项,则不会读取相应类型的任何后续启动文件。$ZDOTDIR 中的文件也可以重新启用 GLOBAL_RCS。RCS 和 GLOBAL_RCS 都是默认设置的。

然后从 $ZDOTDIR/.zshenv 读取命令。 如果 shell 是登录 shell,则从 /etc/zprofile 和 $ZDOTDIR/.zprofile 读取命令。然后,如果 shell 是交互式的,则从 /etc/zshrc 和 $ZDOTDIR/.zshrc 读取命令。最后,如果 shell 是登录 shell,则读取 /etc/zlogin 和 $ZDOTDIR/.zlogin。

该脚本从它被调用的地方继承了环境,如果这不是另一个(交互式)shell,它将不包含您在.zshrc.

您可以设置PATH全局应用的位置(例如/etc/zshenv),直接在脚本中显式设置它,或者更改shebang脚本头以运行/bin/zsh -i,使其加载.zshrc(引用man zsh强制shell交互。仍然可以指定脚本执行。)。

或者,只需指定不在默认的程序的完整路径PATH,例如/home/pc/less.js/bin/lessc.