linux 下 `dirname $0` 的作用

本文深入探讨了Oracle自带的SQLDeveloper启动脚本的工作原理,重点解析了`dirname$0`在脚本中的作用及如何正确引用脚本路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在分析oracle自带的脚本sqldeveloper.sh的时候发现的:
[oracle@linux_64 sqldeveloper]$ cat sqldeveloper.sh
#!/bin/bash
cd “`dirname $0`”/sqldeveloper/bin && bash sqldeveloper $*

# `dirname $0 ` 到底起什么作用:
[oracle@linux_64 sqldeveloper]$ echo `dirname $0`
dirname: invalid option – ‘b’
Try `dirname --help’ for more information.

#直接执行并不能得到结果
#在命令行状态下单纯执行 `dirname $0` 是毫无意义的。只有在脚本中它返回当前路径的"."

#在/tmp下创建1.sh
[oracle@linux_64 sqldeveloper]$ cat /tmp/1.sh
cd `dirname $0`
echo `pwd`

#执行脚本
[oracle@linux_64 sqldeveloper]$ sh /tmp/1.sh
/tmp

#可见执行 dirname $0 是当前路径的意思
#既然如此就做一个实验,将sqldeveloper.sh文件软连接到oracle用户的家目录
[oracle@linux_64 ~]$ ln -s /home/oracle/app/oracle/product/11.2.0/dbhome_1/sqldeveloper/sqldeveloper.sh /home/oracle
#再次执行脚本
[oracle@linux_64 ~]$ ./sqldeveloper.sh
./sqldeveloper.sh: line 2: cd: ./sqldeveloper/bin: No such file or directory

#可见脚本并不能执行,因为执行脚本的目录下没有./sqldeveloper/bin目录

<think>好的,我现在需要解释一下这个Linux命令的含义:dir=$(dirname "$0")。首先,我得确定用户对Linux命令的熟悉程度,可能需要从基础开始讲起。 首先,分解这个命令的结构。dir是一个变量名,等号右边是赋值的内容。这里使用了命令替换,也就是$()里面的命令会被执行,结果赋值给dir变量。那么,dirname "$0"这个部分是什么意思呢? dirname是一个常用的命令,用来获取文件路径的目录部分。比如,如果路径是/home/user/script.sh,dirname会输出/home/user。而"$0"在脚本中代表当前脚本的文件名。所以,dirname "$0"的作用就是获取当前脚本所在的目录路径。 不过,这里需要注意$0的一些特殊情况。当脚本被直接调用时,$0就是脚本的路径;但如果通过符号链接调用,可能会有不同的表现。这时候是否需要加引号?比如"$0",这是为了防止路径中有空格或者其他特殊字符,导致解析错误。所以使用双引号包裹变量是一个好习惯。 接下来,整个命令dir=$(dirname "$0")的作用就是将当前脚本所在的目录路径赋值给变量dir。这样在后续的脚本中,可以通过$dir来引用这个目录,方便进行文件操作,比如读取其他文件或者执行相对路径的命令。 可能还需要举一个例子来说明。比如脚本路径是/opt/scripts/run.sh,执行后,dirname "$0"会得到/opt/scripts,然后dir变量就保存了这个路径。之后如果需要访问同目录下的config文件,就可以用"$dir/config"来指定路径。 另外,可能要注意不同环境下$0的表现差异。比如如果脚本是通过source命令执行的,或者在bash和sh中的行为是否一致。比如在bash中,如果脚本是通过source执行的,$0会是bash的名称,而不是脚本路径。这时候dirname "$0"可能会有不同的结果,需要用户注意使用场景。 还有,是否有其他替代方法可以达到同样的效果?比如使用pwd命令,但pwd显示的是当前工作目录,而dirname "$0"则是脚本所在的目录,这两者在脚本被不同目录调用时结果可能不同。因此,需要根据具体情况选择合适的方法。 最后,总结这个命令的用途和注意事项,确保用户理解如何正确使用它,并避免常见错误。</think>该命令`dir=$(dirname "$0")`用于获取当前执行脚本所在的目录路径,并将结果赋值给`dir`变量。具体分解如下: **分步解释:** 1. `$0` 在Shell脚本中代表当前脚本的文件名(含路径)。例如执行`/home/user/scripts/hello.sh`时,`$0`值为`/home/user/scripts/hello.sh` 2. `dirname`Linux内置命令,用于提取路径中的目录部分。例如: ```bash dirname "/a/b/c.txt" # 输出 /a/b ``` 3. `dirname "$0"` 组合后表示提取当前脚本的所在目录路径。 假设脚本路径为`/opt/myscript/run.sh`,则输出`/opt/myscript` 4. `dir=$(...)` 将括号内命令的结果赋值给变量`dir`,后续可通过`$dir`调用该路径 **典型应用场景:** ```bash #!/bin/bash dir=$(dirname "$0") cd "$dir" # 切换到脚本所在目录 ./subdir/start.sh # 执行同级子目录下的脚本 ``` **注意事项:** 1. `"$0"`必须加双引号,避免路径含空格时被拆分(如`/path with space/script.sh`) 2. 若通过符号链接(symlink)执行脚本,`$0`会返回链接路径而非实际文件路径,此时需改用`realpath`命令修正: ```bash dir=$(dirname "$(realpath "$0")") ``` 3. 当直接通过终端调用(如`bash script.sh`)时,`$0`仅返回`script.sh`,此时`dirname`会输出`.`(当前目录) **扩展对比:** - `pwd`:返回当前终端的工作目录(可能与脚本位置不同) - `$BASH_SOURCE`:更可靠的脚本路径获取方式(兼容`source`调用场景) 最终效果:通过`dir=$(dirname "$0")`可确保脚本准确操作自身所在目录的文件,避免路径错误问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值