Quando a invocação de script requer path / script.sh

1

Lembro claramente de ler que, quando $ PATH não inclui o diretório de trabalho, a invocação de script do Linux requer o caminho, mesmo que o caminho seja ./ e, portanto, a invocação do script seja ./script.sh

Aparentemente, este não é o caso de 14.04.3 LTS, que é script.sh invoca.

Quais são as circunstâncias em que ./ é necessário?

> echo '#!/bin/bash' > test.sh
> echo 'pwd' >> test.sh
> cat test.sh
#!/bin/bash
pwd
> chmod +x test.sh
> test.sh
/home/brian/Desktop/test
> ./test.sh
/home/brian/Desktop/test
> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/brian/Documents/bashscripts:
> echo 'pwd' > test2.sh
> chmod +x test2.sh
> test2.sh
/home/brian/Desktop/test

> echo "$PATH" | od -c
0000000   /   u   s   r   /   l   o   c   a   l   /   s   b   i   n   :
0000020   /   u   s   r   /   l   o   c   a   l   /   b   i   n   :   /
0000040   u   s   r   /   s   b   i   n   :   /   u   s   r   /   b   i
0000060   n   :   /   s   b   i   n   :   /   b   i   n   :   /   h   o
0000100   m   e   /   b   r   i   a   n   /   D   o   c   u   m   e   n
0000120   t   s   /   b   a   s   h   s   c   r   i   p   t   s   :  \n
0000140
> 
    
por H2ONaCl 20.01.2016 / 04:50

1 resposta

2

O motivo é o $PATH terminar em : , que anexa automaticamente o diretório de trabalho atual ao PATH .

Então, você precisa remover o :

export PATH="${PATH%:}"

Exemplo:

$ PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:
$ bar.sh 
Foobar

$ PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ bar.sh
bar.sh: command not found
    
por heemayl 20.01.2016 / 05:12