Почему мой $PATH отличается в выполненном скрипте?

Почему мой $PATH отличается в выполненном скрипте?

echo $PATH внутри терминала gnome:

/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/mpi/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файл следующим образом:

экспортировать ПУТЬ=/home/pc/less.js/bin:$PATH

Почему не работает в скрипте при запуске в виде файла? Проблема в том, что команда lessc не находится.

решение1

Скрипт запускается с помощью /bin/zsh, который не является интерактивной или входной оболочкой и не загружает этот файл. Из man zsh, выделено мной:

Команды сначала считываются из /etc/zshenv; это нельзя переопределить. Последующее поведение изменяется параметрами RCS и GLOBAL_RCS; первый влияет на все файлы запуска, а второй влияет только на глобальные файлы запуска (те, которые показаны здесь с путем, начинающимся с /). Если один из параметров не установлен в любой момент, любой последующий файл(ы) запуска соответствующего типа не будет считан. Также возможно, чтобы файл в $ZDOTDIR повторно включил GLOBAL_RCS. И RCS, и GLOBAL_RCS установлены по умолчанию.

Затем команды считываются из $ZDOTDIR/.zshenv. Если оболочка является оболочкой входа, команды считываются из /etc/zprofile, а затем $ZDOTDIR/.zprofile. Затем, если оболочка интерактивная, команды считываются из /etc/zshrc, а затем $ZDOTDIR/.zshrc. Наконец, если оболочка является оболочкой входа, считываются /etc/zlogin и $ZDOTDIR/.zlogin.

Скрипт наследует среду, из которой он вызван, и если это не другая (интерактивная) оболочка, он не будет содержать заданные вами настройки .zshrc.

Вы можете задать PATHглобальное применение (например /etc/zshenv, ), явно указать его непосредственно в скрипте или изменить заголовок скрипта shebang, чтобы он запускался /bin/zsh -iвместо этого, заставляя его загружаться .zshrc(цитата man zsh:Принудительно сделать оболочку интерактивной. По-прежнему возможно указать скрипт для выполнения.).

Либо просто укажите полный путь к программе, которой нет в каталоге по умолчанию 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 использует последующие глобальные файлы запуска.

Связанный контент