• shell脚本中报错dirname:无效选项 b(转)


    原文: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 命令运行脚本即可。

  • 相关阅读:
    WCF Security基本概念(转载)
    Step by Step 配置使用HTTPS的ASP.NET Web应用
    HTTPS那些事(三)攻击实例与防御(转载)
    HTTPS那些事(二)SSL证书(转载)
    HTTPS那些事(一)HTTPS原理(转载)
    WCF服务创建与抛出强类型SOAP Fault
    WCF服务的异常消息
    如何创建一个RESTful WCF Service
    (转)webHttpBinding、basicHttpBinding和wsHttpBinding区别
    如何创建一个AJAX-Enabled WCF Service
  • 原文地址:https://www.cnblogs.com/ajianbeyourself/p/16576408.html
Copyright © 2020-2023  润新知