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

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
gauss_clb
帖子: 1
注册时间: 2017-06-11 17:50
系统: ubuntu

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

#1

帖子 gauss_clb » 2017-06-11 18:03

作为一名新手,上来就遇到一大堆问题,压力太大。
首先在当前目录下有一个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
就报权限错误了。
第二个问题:为什么会报权限错误呢?
头像
vickycq
帖子: 4507
注册时间: 2011-03-20 13:12
系统: Debian
来自: 山东省寿光县
联系:

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

#2

帖子 vickycq » 2017-06-11 19:44

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 (更可靠)
Debian 中文论坛 - forums.debiancn.org
欢迎所有 Debian GNU/Linux 用户
回复