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

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

在 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/编程/软件/tup:/home/pc/编程/库/depottools:/home/pc/编程/库/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

在 /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

正如你所见,我.zshrc使用以下命令修改了我的文件:

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

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

答案1

该脚本使用 运行/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

答案2

zsh 启动文件(又名 rc 文件)

下面的非完整路径的文件名前面隐含着“$ZDOTDIR/”,这通常是您的主目录。

zsh 获取启动脚本文件的顺序如下。

/etc/zshenv– 首先,从这里读取命令;选项不能覆盖这一点。

.zshenv

/etc/zprofile– 登录外壳

.zprofile– 登录外壳

/etc/zshrc– 交互式外壳

.zshrc– 交互式外壳

/etc/zlogin– 登录外壳

.zlogin– 登录外壳

两个 zsh 选项会影响 zsh 是否获取上述某些文件。(“RCS” 是“rc”的复数,以大写形式呈现。)

RCS 和 GLOBAL_RCS zsh 选项默认设置。

  • RCS – 影响所有启动文件
  • GLOBAL_RCS – 仅影响全局启动文件(以“/”开头的路径名)

如果启动文件取消设置其中一个选项,zsh 将跳过该类型的后续启动文件。

如果启动文件设置了 GLOBAL_RCS 选项,zsh 将获取后续全局启动文件。

相关内容