Por que meu $PATH é diferente no script executado?

Por que meu $PATH é diferente no script executado?

echo $PATH dentro do terminal 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/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:/home/pc/Programação/Software/tup:/home/pc/Programação/ Bibliotecas/depottools:/home/pc/Programming/Libraries/apache-maven-3.0.4/bin

De dentro deste script:

#!/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/jogos:/usr/lib64/jvm/jre/bin

Como você pode ver, modifiquei meu .zshrcarquivo com isto:

exportar PATH=/home/pc/less.js/bin:$PATH

Por que não funciona no script quando executado como um arquivo? O problema é que o comando lessc não está sendo encontrado.

Responder1

O script é executado usando /bin/zsh, que não é um shell interativo ou de login e não carrega este arquivo. De man zsh, ênfase minha:

Os comandos são lidos primeiro em /etc/zshenv; isso não pode ser substituído. O comportamento subsequente é modificado pelas opções RCS e GLOBAL_RCS; o primeiro afeta todos os arquivos de inicialização, enquanto o segundo afeta apenas os arquivos de inicialização globais (aqueles mostrados aqui com um caminho começando com /). Se uma das opções não for definida a qualquer momento, quaisquer arquivos de inicialização subsequentes do tipo correspondente não serão lidos. Também é possível que um arquivo em $ZDOTDIR reative GLOBAL_RCS. Tanto RCS quanto GLOBAL_RCS são definidos por padrão.

Os comandos são então lidos em $ZDOTDIR/.zshenv. Se o shell for um shell de login, os comandos serão lidos em /etc/zprofile e depois em $ZDOTDIR/.zprofile. Então, se o shell for interativo, os comandos serão lidos em /etc/zshrc e depois em $ZDOTDIR/.zshrc. Finalmente, se o shell for um shell de login, /etc/zlogin e $ZDOTDIR/.zlogin serão lidos.

O script herda o ambiente de onde é chamado e, se este não for outro shell (interativo), não conterá as preferências definidas em .zshrc.

Você pode definir PATHonde ele se aplica globalmente (por exemplo /etc/zshenv), defini-lo explicitamente no script diretamente ou alterar o cabeçalho do script shebang para ser executado /bin/zsh -i, fazendo-o carregar .zshrc(citando man zsh:Força o shell a ser interativo. Ainda é possível especificar um script para execução.).

Alternativamente, apenas especifique o caminho completo para o programa que não está no padrão PATH, por exemplo /home/pc/less.js/bin/lessc.

Responder2

arquivos de inicialização zsh (também conhecidos como arquivos rc)

Um nome de arquivo abaixo que não seja um caminho completo é implicitamente precedido por “$ZDOTDIR/”, que normalmente é seu diretório inicial.

A ordem em que o zsh origina os arquivos de script de inicialização é a seguinte.

/etc/zshenv– Primeiro, os comandos são lidos daqui; as opções não podem ser substituídas por isso.

.zshenv

/etc/zprofile– shell de login

.zperfil– shell de login

/etc/zshrc– shell interativo

.zshrc– shell interativo

/etc/zlogin– shell de login

.zlogin– shell de login

Duas opções zsh afetam se o zsh origina alguns dos arquivos acima. (“RCS” é o plural de “rc”, traduzido em maiúsculas.)

As opções RCS e GLOBAL_RCS zsh são definidas por padrão.

  • RCS – afeta todos os arquivos de inicialização
  • GLOBAL_RCS – afeta apenas arquivos de inicialização globais (nomes de caminho começando com “/”)

Se um arquivo de inicialização desativar uma dessas opções, o zsh ignora os arquivos de inicialização subsequentes desse tipo.

Se um arquivo de inicialização definir a opção GLOBAL_RCS, o zsh origina os arquivos de inicialização globais subsequentes.

informação relacionada