shell脚本中报错dirname:无效选项 -- b(转)
shell 报错 -- 脚本 无效 选项 dirname
2023-09-14 08:58:45 时间
原文:https://blog.51cto.com/dbaway/1693490
今天在写一个Shell脚本的时候,发现调试的时候会报一个错
[oracle@smidb11 autoawrrpt]$ . a.sh dirname:无效选项 -- b 请尝试执行"dirname --help"来获取更多信息。 basename:无效选项 -- b 请尝试执行"basename --help"来获取更多信息。
脚本内容如下:
[oracle@smidb11 autoawrrpt]$ cat a.sh #!/bin/bash ################################################################################ #自动生成最新的AWR报表 #版本:v1.0 #变量说明: #LOGFILE:保存日志文件名 ####################################修改历史#################################### # ################################################################################ WORKDIR=$(dirname $0) #获取到脚本所在目录 cd ${WORKDIR} #改变当前目录为脚本所在目录 WORKDIR=`pwd` #获取当前目录的具体路径 SCRIPTNAME=$(basename $0) #获取脚本名称 FPATH="${WORKDIR}\${SCRIPTNAME}" #脚本全路径 LOGFILE="${WORKDIR}/${SCRIPTNAME}.log" #设置日志文件名称 AWR_TYPE="html" #设置AWR的类型,值应该为html或者txt AWR_HOME="${WORKDIR}/awr_report" #设置存放AWR报表的目录 AWR_DAYS=1 #设置AWR Snap检索的天数 HOSTNAME=`hostname` #主机名 mkdir -p ${AWR_HOME} #如果没有此目录,则创建 -p选项代表无则创建,有则直接返回
报错的是在 WORKDIR=$(dirname $0) 这一行内容,这让我感觉很奇怪,第一,我没有在这个命令后面添加-b选项啊,为什么会报错错误的选项 -b 呢?
然后在这行下面增加 echo $0 输出,看看$0的内容到底是什么
[oracle@smidb11 autoawrrpt]$ . a.sh dirname:无效选项 -- b 请尝试执行"dirname --help"来获取更多信息。 -bash basename:无效选项 -- b 请尝试执行"basename --help"来获取更多信息。
这就奇怪了,$0 不是应该返回脚本的当前路径吗? 怎么会变成 -base 了呢?
我们接着试验:
[oracle@smidb11 autoawrrpt]$ ./a.sh ./a.sh
直接运行,输出结果变成正确的啦,$0输出执行脚本的相对路径.
为什么会导致这样的问题呢?为了证明这个问题,我们直接在shell里面运行 echo $0
[mysql@test ~]$ echo $0 -bash
然后我们回顾一下,Linux下面的点命令
使用 点命令执行脚本的时候,直接在当前的shell中执行脚本,而不会打开一个新的Shell执行脚本
看到这里我们就不难理解了。因为 . 命令不会打开新的Shell执行脚本,所以echo $0的时候,$0的值还是我们原来的shell的$0, 也就是 -bash 了, 而 basename命令就会把 -bash当成一个参数来执行,所以才会报错,错误的选项 -b。
知道原因了,我们的问题也就很好解决了,直接运行,不要通过 点命令 或者 source 命令运行脚本即可。
相关文章
- shell脚本--continue、break
- cdh集成Spark2.2后spark-shell启动报错解决
- 【Shell】fix 1032报错信息的脚本
- Linux Shell脚本自动化编程实战- shell内置命令 break、continue
- Linux Shell脚本自动化编程实战- shell并发
- Linux Shell脚本自动化编程实战-shell变量(一)
- 获取shell脚本自身所在目录的Shell脚本分享
- Linux Shell脚本自动化编程实战- shell并发
- Shell while语句
- Keepalived Shell脚本来简单实现keepalived功能
- RAC环境部署自动化shell脚本
- how is SAP ui5 shell view implemented
- shell脚本
- [shell]Shell经常使用特殊符号
- shell脚本中的数学运算
- 执行Spark运行在yarn上的命令报错 spark-shell --master yarn-client
- Shell中EOF内容转义
- 19.第六章 Shell脚本编程基础入门 -- shell 脚本语言的基本用法(二)
- Shell脚本运行hive语句 | hive以日期建立分区表 | linux schedule程序 | sed替换文件字符串 | shell推断hdfs文件文件夹是否存在
- BAT脚本如何自动执行 adb shell 以后的命令
- SHELL脚本之基础网络检查
- 报时机器人的rasa shell执行流程分析
- Shell脚本的学习心得和知识总结(三)| shell语句
- shell脚本中实现数组变量
- shell之自定义mykill(十六)
- shell之逻辑判断&&和-a区别(八)
- 为Android安装BusyBox —— 完整的bash shell