Ubuntu默认的dash带来的问题

2023-11-04

Ubuntu默认dash带来的问题


前述

在这篇文章开始之前,如果不知道什么是dash或者dash与bash的区别是什么,我们可以先轻松的浏览一下小编的前一篇文章,小编不敢保证我们看了之后就对bash、dash了解透彻,但是小编认为阅后对bash和dash有一个清晰的认识是完全没问题的!
这里呈上文章https://blog.csdn.net/weixin_39212776/article/details/81079727


问题的重述

相信很多朋友在Ubuntu高版本的环境下啃《鸟哥的Linux私房菜》的时候都会觉得有这样一些疑惑:为什么我的shell脚本和鸟哥的一样,为什么我的会报错呢?然后经过一番了解之后我们会发现,我们使用的高版本Ubuntu的shell工具默认是dash,但是鸟哥的CentOS默认的是bash,也正是这个区别造成了我们的苦恼!

下面我们针对鸟哥书上的个别案例具体讲述一下上述两者的区别的所在,以及我们怎么解决或者是避免它:
鸟哥书的13章中的“利用判断符号[]” 的例子代码如下:

#!/bin/bash     # 仔细看这里是bash
# Program:
#       This Program shows the users's choice
# History:
# 2018/7/18 Richard     First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

read -p "Please input your choice (Y/N):" yn
[ "$yn" = "Y" -o "$yn" = "y" ] && echo "OK, continue" && exit 0
[ "$yn" = "N" -o "$yn" = "n" ] && echo "Oh, interrupt!" && exit 0

echo "I dont't know what your choice is" && exit 0

我们运行以上的例子看看:

root@Richard:~/scripts# sh sh06.sh
Please input your choice (Y/N):Y
sh06.sh: 10: [: Y: unexpected operator
sh06.sh: 11: [: Y: unexpected operator
I dont't know what your choice is

至此我们发现了问题,这便是上述的不同造成的,这一点我也不再赘述,下面我们的重点是在怎么解决它?如下。


问题的解决方案

我们知道脚本的第一行

#!/bin/bash

是指此脚本使用/bin/bash来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。
但是正如上面我们使用的sh 执行命令是符号链接到的dash解释工具,我们用dash去解释一个自身规定了要用bash执行的脚本,这固然会出错嘛!所以我们可以这样来解决:

  • 方案一:第一行“#!/bin/bash“保持不变,只是在运行时我们调用bash去解释执行:
root@Richard:~/scripts# bash sh06.sh 
Please input your choice (Y/N):y
OK, continue

这样就完美解决了!

  • 方案二:将shell脚本开始的“#!/bin/bash”改为=>”#!/bin/dash“或“#!/bin/sh”,同时在将符号”[]”里的“==”改为=> “=” , 使用sh或dash命令运行即可:
#!/bin/sh
# Program:
#       This Program shows the users's choice
# History:
# 2018/7/18 Richard     First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

read -p "Please input your choice (Y/N):" yn
[ "$yn" = "Y" -o "$yn" = "y" ] && echo "OK, continue" && exit 0  # 只有一个等号
[ "$yn" = "N" -o "$yn" = "n" ] && echo "Oh, interrupt!" && exit 0  # 只有一个等号

echo "I dont't know what your choice is" && exit 0

再按照习惯正常运行:

root@Richard:~/scripts# sh sh06.sh
Please input your choice (Y/N):y
OK, continue

上面我们关注到判断符号有原来的“==”变成了“=”,其实“等于”的判断在bash中使用“==”或“=”都是可以的,但是在dash中却规定了只有使用“=”才可以,所以我们原来使用“==”再调用dash去解释是会报错咯!

  • 方案三:如果像上面一样解决,我们可能会觉得和鸟哥书上有所出入,我会不爽的,那么我们还有一个终极的办法,直接将高级Ubuntu默认的dash改为和鸟哥一样默认是bash,这样的我们在跟着鸟哥的书走就不会出类似的错了;我们在命令窗口直接输入”sudo dpkg-reconfigure dash“,像这样:
root@Richard:~/scripts# sudo dpkg-reconfigure dash

在弹出的窗口中选择 否 即可:

这里写图片描述

此后,我们的Ubuntu就是默认的bash执行了,如果想切换回来用dash我们再执行一遍上述命令,再选 是 就OK了

接下来我们就可以像鸟哥一样操作没问题了!尽情地遨游Linux的海洋吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu默认的dash带来的问题 的相关文章

  • POSIX:FreeBSD 与 Linux 中的管道系统调用

    在 Linux 2 6 35 22 generic 中 man pipe指出 pipeline 创建一个管道 一个可用于进程间通信的单向数据通道 在 FreeBSD 6 3 RELEASE p5 中 man pipe指出 pipeline
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • 是否可以允许jenkins访问只有root或某些特定程序可以访问的文件?

    我基本上想做的是允许 jenkins 访问我的 android sdk linux 文件夹和所有子目录 我的老板不想自己更改文件夹的权限 我应该在构建过程中这样做 我见过一些在构建过程中在执行 shell 中运行一些命令的示例 是否可以在该
  • 获取当前时间(以小时和分钟为单位)

    我正在尝试从系统收集信息 并且需要获取当前时间 以小时和分钟为单位 目前我有 date awk print 4 输出如下 16 18 54 怎样才能把秒数去掉呢 提供格式字符串 date H M Running man date将给出所有格
  • PyGTK+3(PyGObject)创建屏幕截图?

    我过去 3 天在 google 上搜索 如何使用 PyGTK 3 创建屏幕截图 有关于 pyqt pygtk 2 wx 和 PIL 的 gallizion 教程 顺便说一句 我不需要 scrot imlib2 imagemagick 等外部
  • 内核如何区分线程和进程

    Linux 中的线程被称为轻量级进程 无论是进程还是线程 它们的实现都是通过task struct数据结构 1 gt 那么 从这个意义上说 内核如何区分线程和进程 2 gt 当发生上下文切换时 线程如何在上下文切换中获得更少的开销 因为在此
  • 如何永久清除 linux/ubuntu 终端或 bash 中的所有历史记录? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当您在 Linux 终端中使用向上键时 可以再次使用之前的命令 很棒的功能 但是 我开始使用命令中的敏感详细信息将 mysql 记录到 mysql 中
  • Linux 中不使用 C++ 的 C 异常处理

    Linux 是否提供了 C 语言的异常处理而不求助于 C 或者 实现此类异常处理的最佳方法是什么 目标是避免检查每个调用的函数的返回码 而是执行类似于 C 的线程安全且易于移植的操作 您可以通过为其编写信号处理程序来处理信号 GNU 记录的
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • vm.dirty_ratio 和 vm.dirty_background_ratio 之间的区别?

    我目前正在试验中找到的内核参数 proc sys vm 尤其dirty ratio and dirty background ratio 内核文档对两者都有以下解释 脏背景比例 包含 以包含空闲页面的总可用内存的百分比表示 和可回收页 后台
  • 有没有比使用 backtrace() 更便宜的方法来查找调用堆栈的深度?

    我的日志记录代码使用的返回值回溯 http linux die net man 3 backtrace确定当前堆栈深度 出于漂亮的打印目的 但我可以从分析中看到这是一个相当昂贵的调用 我不认为有更便宜的方法吗 请注意 我不关心帧地址 只关心
  • 更改 Amazon RDS MYSQL Linux 服务器的 innodb_log_file_size 变量值

    我们正在使用 Amazon RDS linux 服务器作为 MYSQL 更改 my cnf 文件变量值的方法是什么 我正在尝试更改 innodb log file size 变量 您能告诉我哪一个是最好的改变方式吗 所以请帮我解决这个问题
  • 使用请求和多处理时的奇怪问题

    请检查这个Python代码 usr bin env python import requests import multiprocessing from time import sleep time from requests import
  • 如何在 Ubuntu 上通过 pip 安装 python3 版本的软件包?

    我两者都有python2 7 and python3 2安装在Ubuntu 12 04 符号链接python链接到python2 7 当我输入 sudo pip install package name 它将默认安装python2的版本pa
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • Linux 源代码中的哪个位置会识别特定的 USB 设备?

    我有一个特定的 USB 设备 我想检查其 Linux 驱动程序源代码 我的理解是 USB 驱动程序执行的第一步是注册自己能够处理具有特定供应商 ID 和产品 ID 的设备 就我而言 供应商 ID 是0BDA产品 ID 是8187 有了这些信
  • MYSQL插入GB大小的巨大SQL文件

    我正在尝试创建 Wikipedia DB 副本 大约 50GB 但在处理最大的 SQL 文件时遇到问题 我使用 linux split 实用程序将 GB 大小的文件拆分为 300 MB 的块 例如 split d l 50 enwiki 2
  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我
  • 除了 iptables 之外还有数据包管理实用程序吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Linux 实用程序 它可以根据一组规则更改网络数据包的有效负载 理想情况下 我会使用

随机推荐

  • C++ 中 map 容器的内存释放机制及内存碎片管理

    C 中 map 容器的内存释放机制及内存碎片管理 C 中的容器很好用 比如 vector map 等 可以动态扩容 自己管理内存 不用用户关心 但是在某些极端情况下 如果内存比较紧张的情况下 可能用户对于这些容器自己的管理规则 主要是释放规
  • Linux read命令

    读取n个字符存入变量 不用按回车 输入到第n个自动结束 student myhost read n 3 a 123 student myhost echo a 123 无回显方式读取密码 student myhost read s pass
  • windows spacemacs实现org-mode转latex,然后生成pdf

    spacemacs默认英文字体做如下修改 安装了完整版ctex套装 spacemacs增加layer gt latex 增加windows的path路径 解决org mode里中英文等宽问题 latex编译命令 pdf预览等 实现了org转
  • 什么是文件目录,文件目录项的主要内容是什么?

    文件目录是记录系统中所有文件的名字及其存放地址的目录表 表中还包括关于文件的说明信息和控制信息 主要内容如下 1 文件名 文件名分为文件的符号名和内部标识符 id号 2 文件的逻辑结构 说明该文件是否是定长 记录长度及记录个数等 3 文件的
  • USB如何布局走线

    1 先上图 USB分为2 0和3 0 2 USB布局走线需要注意的地方 静电防护 阻抗匹配 同组等长
  • cv::Mat遍历赋值的几种方式

    cv Mat赋值的几种方式 1 前言 2 Mat简介 3 遍历Mat赋值方式 方式一 方式二 方式三 4 测试 5 参考文献 1 前言 背景 获取传感器数据后需要保存成图片 有时需要对里面的元素进行操作 因为是自己开发 不能直接得到图片 所
  • CopyOnWriteArrayList部分源码分析

    CopyOnWriteArrayList部分源码分析 我们都知道ArrayList是基于数组实现的可动态扩容的集合 但是他实际上也是线程不安全的 而在JUC java util concurrent 下有个线程安全的数组集合 就是CopyO
  • django开发电子商城(四)django分页进阶和列表长度控制

    1 在list html中增加bootstrap分页代码 2 增加样式 使分页列表居中 3 修改views py文件 将分页数据传到前端 4 修改list html 根据传到前端的分页数据进行渲染分页条
  • 1035 插入与归并

    1035 插入与归并 根据维基百科的定义 插入排序是迭代算法 逐一获得输入数据 逐步产生有序的输出序列 每步迭代中 算法从输入序列中取出一元素 将之插入有序序列中正确的位置 如此迭代直到全部元素有序 归并排序进行如下迭代操作 首先将原始序列
  • python循环语句for 循环十次_python循环10次写法以及实例代码

    python循环10次怎么写 Python for循环可以遍历任何序列的项目 如一个列表或者一个字符串 语法 for循环的语法格式如下 for iterating var in sequence statements s 例子 for i
  • PHP 实现网页爬虫

    方法一 通过fopen和stream get contents获取html内容 从给定的url获取html内容 爬虫程序 原型 从给定的url获取html内容 通过fopen和stream get contents获取html内容 para
  • vue+typescript与UE4像素流通信笔记

    一 文件准备 1 从搭建好的UE4项目下找到scripts文件夹 拷贝该文件夹 重点文件为app js与webRtcPlayer js 到vue项目下的静态资源文件夹 默认public文件夹 下 如下图 在vue项目的index html下
  • Cocos2d-x的SprideMonkey的JavaScript与C++的交互(二) - 单个全局变量操作

    哇塞最近发现转帖的真多呀 这星期五写的东东 现在满大街都是了 哥哥也不问功名利禄 感觉挺好的 JS火起来我也很开心 呵呵 当时快下班了 这篇写的有些仓促 现在加精一些 首先来理解一下sc gt getGlobalObject 这个同学们就问
  • 第六章 一山不容二虎

    第六章 一山不容二虎 收购规则 6 在同一行业里 同一重量级的收购不会取得成功 一座山上不能同时容纳两只老虎 为什么呢 因为老虎是百兽之王 两只老虎都想称王 最后无法协商 只好用牙齿和爪子较量一番 战败者一瘸一拐地离 去 战胜者舔着伤口在山
  • 从零讲解目标检测的评价指标map及实现

    前言 map是 Mean Average Precision 的缩写 翻译过来是平均精度的平均 有点绕啊 在理解map之前 先问个为什么要引入map 在分类任务中 常使用精确率和召回率作为评价指标 也称查准率和查全率 这是一个简单直接的统计
  • C语言:二进制、八进制、十六进制整数的书写及输出

    目录 一 整型数据类型 二 二进制 八进制 十六进制的书写 1 二进制 以 0b 0B 开头 不区分大小写 数字0 而非字母o 下同 2 八进制 以数字 0 开头 3 十六进制 以 0x 0X 开头 三 二进制 八进制和十六进制的输出 八进
  • make update-api 的由来

    谷歌对于所有的类和API 分为开放和非开放两种 当我们修改framework目录中的java文件时 比如添加API 删除API 声明变量 编译器都需要我们决定API是开放还是非开放 对于开放的类和API 可以通过 Javadoc标签 与源码
  • HTML与CSS详细介绍

    HTML 与 CSS 1 主要内容 2 HTML HTML HyperText Markup Language 就是超 本标记语 超 本 就是表示 内可以包含 字元素 如 图 链接 乐等等 它是 种建 件的语 通过标记式的指令 Tag 将影
  • excel修改服务器名称,云服务器 修改Excel

    云服务器 修改Excel 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 本节操作介绍Linux云服务器切换密钥登录为密码
  • Ubuntu默认的dash带来的问题

    Ubuntu默认dash带来的问题 前述 在这篇文章开始之前 如果不知道什么是dash或者dash与bash的区别是什么 我们可以先轻松的浏览一下小编的前一篇文章 小编不敢保证我们看了之后就对bash dash了解透彻 但是小编认为阅后对b