分页: 1 / 1

关于./ source dirname等无法解释的问题

发表于 : 2017-06-11 18:03
gauss_clb
作为一名新手,上来就遇到一大堆问题,压力太大。
首先在当前目录下有一个xxx目录,xxx目录下有一个abc.sh

abc.sh的内容如下:

代码: 全选

#!/bin/sh

x=$0
echo $x
下一步输入

代码: 全选

chmod +x xxx/abc.sh
修改权限后,输入

代码: 全选

./xxx/abc.sh
输出显示

代码: 全选

./xxx/abc.sh
一切正常,但输入

代码: 全选

source xxx/abc.sh
显示

代码: 全选

bash
这是第一个问题:为什么source会显示bash?

接下来修改abc.sh的内容如下:

代码: 全选

#!/bin/sh

$(dirname $0)
这次输入

代码: 全选

./xxx/abc.sh
就报权限错误了。
第二个问题:为什么会报权限错误呢?

Re: 关于./ source dirname等无法解释的问题

发表于 : 2017-06-11 19:44
vickycq
gauss_clb 写了:一切正常,但输入source xxx/abc.sh显示bash
source 使得脚本在当前 shell 中执行,脚本不作为额外的进程。$0 为进程名,即为当前 shell:bash
可以试试:脚本里加一句 sleep 1000,然后趁休眠 1000 秒另开一个终端用 ps ax 和 pstree | grep sleep 查看进程列表和进程树中 sleep 的父进程。

如果要获取脚本路径,可以把解释器换成 bash 然后用 BASH_SOURCE

gauss_clb 写了:#!/bin/sh
$(dirname $0)
这次输入./xxx/abc.sh就报权限错误了。
这一行相当于 ./xxx,即执行一个目录
脚本使用 /bin/sh (-> /bin/dash) 解释。在 dash 中,执行一个目录会报权限错误,具体原因不清楚。
在 bash 中执行就会报 ./xxx: Is a directory。

要打印脚本所在目录可以用 echo $(dirname $0) 或 echo `dirname $0` 或 dirname $0。或把解释器换成 bash 然后用 BASH_SOURCE (更可靠)