脚本调用何时需要 path/script.sh

脚本调用何时需要 path/script.sh

我清楚地记得读到过,当 $PATH 不包含工作目录时,Linux 脚本调用需要路径,即使路径是./,因此脚本调用是./script.sh

显然,14.04.3 LTS 并非如此,这是script.sh调用。

什么情况下./需要?

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

答案1

原因是您$PATH以 a 结尾,:它会自动将当前工作目录附加到PATH

因此你需要删除尾随的:

export PATH="${PATH%:}"

例子:

$ 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

相关内容