Por que meu $ PATH é diferente no script executado?

4

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

De dentro desse 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/games:/usr/lib64/jvm/jre/bin

Como você pode ver, eu modifiquei meu arquivo .zshrc com isto:

export 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.

    
por Blub 27.04.2012 / 17:40

2 respostas

5

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

Commands are first read from /etc/zshenv; this cannot be overridden. Subsequent behaviour is modified by the RCS and GLOBAL_RCS options; the former affects all startup files, while the second only affects global startup files (those shown here with an path starting with a /). If one of the options is unset at any point, any subsequent startup file(s) of the corresponding type will not be read. It is also possible for a file in $ZDOTDIR to re-enable GLOBAL_RCS. Both RCS and GLOBAL_RCS are set by default.

Commands are then read from $ZDOTDIR/.zshenv. If the shell is a login shell, commands are read from /etc/zprofile and then $ZDOTDIR/.zprofile. Then, if the shell is interactive, commands are read from /etc/zshrc and then $ZDOTDIR/.zshrc. Finally, if the shell is a login shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.

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

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

Como alternativa, basta especificar o caminho completo para o programa que não está no padrão PATH , por exemplo, /home/pc/less.js/bin/lessc .

    
por 27.04.2012 / 17:46
1

arquivos de inicialização do zsh (arquivos a.k.a.rc)

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

A ordem em que os arquivos de script de inicialização do zsh sources são os seguintes.

/ etc / zshenv - Primeiro, os comandos são lidos a partir daqui; opções não podem sobrescrever isso.

.zshenv

/ etc / zprofile - shell de login

.zprofile - 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 acessa alguns dos arquivos acima. (“RCS” é o plural de “rc”, renderizado 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 somente arquivos de inicialização globais (nomes de caminho que começam com “/”)

Se um arquivo de inicialização cancelar uma dessas opções, o zsh pula os arquivos de inicialização subseqüentes daquele tipo.

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

    
por 22.08.2012 / 01:58

Tags