linux shell脚本 报错dirname:无效选项 -- b 错误原因 解决方法

本文探讨了一个Shell脚本中dirname和basename命令出现的奇怪错误,并详细解释了为何在使用点命令执行脚本时会出现无效选项--b的错误提示。通过对比不同执行方式下的结果,最终给出了合理的解决方案。

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

今天在写一个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 输出,增加后代码如下:

[oracle@smidb11 autoawrrpt]$ cat a.sh
#!/bin/bash
################################################################################
#自动生成最新的AWR报表
#版本:v1.0
#变量说明:
#LOGFILE:保存日志文件名
####################################修改历史####################################
#
################################################################################
WORKDIR=$(dirname $0)                     #获取到脚本所在目录
cd ${WORKDIR}                             #改变当前目录为脚本所在目录
WORKDIR=`pwd`                             #获取当前目录的具体路径
echo $0
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选项代表无则创建,有则直接返回

看看$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 命令运行脚本即可。
 

### jweixin-module ReferenceError 错误分析及解决方案 在使用 `jweixin-module` 时,出现 `ReferenceError: require is not defined` 的错误通常是由于以下原因引起的:该模块依赖于 Node.js 的 `require` 方法,而此方法在浏览器环境中并不直接可用[^1]。以下是详细的分析和解决方法: #### 1. **错误原因** `jweixin-module` 是一个用于微信 JS-SDK 的封装库,通常需要在前端代码中引入并初始化。然而,`require` 是 Node.js 环境下的模块加载方式,在纯浏览器环境中(如 HTML 文件中通过 `<script>` 标签引入)无法直接使用。如果尝试在非 Node.js 环境下直接调用 `require`,就会抛出 `ReferenceError` 错误。 #### 2. **解决方案** ##### 方法一:使用 Webpack 或 Browserify 打包 为了在浏览器环境中使用 `require`,可以借助工具如 Webpack 或 Browserify 将 Node.js 模块转换为适合浏览器的格式。以下是基于 Webpack 的示例配置: ```javascript // webpack.config.js const path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist'), }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'], }, }, }, ], }, }; ``` 在项目根目录运行以下命令以打包代码: ```bash npx webpack --config webpack.config.js ``` 完成后,将生成的 `bundle.js` 文件引入到 HTML 中即可正常运行。 ##### 方法二:通过 CDN 引入 jweixin-module 如果不想使用打包工具,可以直接通过 CDN 引入 `jweixin-module`,这样可以避免 `require` 的问题。例如: ```html <script src="https://cdn.jsdelivr.net/npm/jweixin-module/dist/jweixin.min.js"></script> ``` 然后在代码中直接使用全局变量 `wx` 进行初始化: ```javascript wx.config({ debug: true, appId: 'your-app-id', timestamp: 'your-timestamp', nonceStr: 'your-nonce-str', signature: 'your-signature', jsApiList: ['checkJsApi', 'onMenuShareTimeline'] }); ``` ##### 方法三:检查环境是否支持 Node.js 模块 如果项目运行在类 Node.js 环境中(如 Electron 或某些框架提供的虚拟环境),确保已正确安装 `jweixin-module` 并在正确的上下文中调用它。例如,确保通过 `npm install jweixin-module` 安装了模块,并且在代码中正确引入: ```javascript const wx = require('jweixin-module'); ``` #### 3. **注意事项** - 如果项目是基于 React、Vue 等现代框架开发的,请确保这些框架支持 CommonJS 模块加载方式。 - 如果仍然遇到问题,可以尝试升级 `jweixin-module` 到最新版本,或者查阅官方文档获取更多支持信息[^1]。 ```javascript // 示例:React 项目中使用 jweixin-module import wx from 'jweixin-module'; wx.config({ debug: false, appId: 'your-app-id', timestamp: 'your-timestamp', nonceStr: 'your-nonce-str', signature: 'your-signature', jsApiList: ['onMenuShareTimeline'] }); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值