热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Ubuntudash与bash的区别

UbuntudashShellhttps:wiki.ubuntu.comDashAsBinShhttp:pubs.opengroup.orgonlinepubs9699919799

Ubuntudash Shell

 

https://wiki.ubuntu.com/DashAsBinSh

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_title.html

从Ubuntu 6.10开始,默认使用dash(theDebian Almquist Shell)而不是bash(the GNUBourne-Again Shell). 但Login Shell还是bash. 原因是dash更快、更高效,而且它符合POSIX规范。Ubuntu在启动的时候会运行很多shell脚本,使用dash可以加快启动速度。

 

  • 如果解决bash和dash兼容性导致的问题
       
    • 在需要bash的脚本的第一行写上"#!/bin/bash" 
    • 在Makefile中可以设置

SHELL = /bin/bash

  • 如果需要修改默认为bash,请运行下面命令并选择no。注意这将影响所有的系统脚本。如果有脚本需要dash的特有功能,将引起问题(这种情况比较少)。

sudodpkg-reconfigure dash

  • 在新写的shell脚本里避免使用bash的扩展特性(bashism)。
       
    • 使用devscripts包的checkbashisms      命令可以检查shell脚本里是否存在bashism. 
    • 安装autoconf-doc包运行info autoconf命令可以阅读"Portable      Shell" 部分的文档来了解POSIX Shell。 
    • 在"["命令(test)中避免使用-a, -o,应该使用多个"[]"命令并用"&&",      "||"连接。
                  例如:下面的shell语句

[\( "$foo" = "$bar" -a -f /bin/baz \) -o ! -x /bin/quux ]

应该替换为:

((["$foo" = "$bar" ] && [ -f /bin/baz ]) || [ ! -x/bin/quux ])

  • 不应该使用"[["命令,而应该使用"["命令
  • 使用$((…))而不是((…))做算术计算。
  • 不能使用$((n++)),     $((--n)) ,而应该是$((n=n+1)) 和$((n=n-1))
  • 不要使用{}进行字符扩展,例如/usr/lib/libfoo.{a,so};    
  • 避免使用$'…'扩展转义字符。例如,使用"$(printf     '\t')" 代替$'\t'
  • 不要使用$"…"进行字符串翻译。应该使用gettext.sh脚本。
  • 大部分的${…}进行变量扩展都是可移植的。但是下面的几个不是。
       
    • ${!...}进行非直接变量扩展,应该使用eval命令。 
    • ${parameter/pattern/string}进行模式替换 
    • ${parameter:offset:length}截取子串
  • 不要使用${parm/?/pat[/str]}进行字符替换,而应该使用echo, sed, grep,     awk等命令。例如:

OPENGL_VERSION=$(glxinfo| grep "OpenGL version string:")

OPENGL_VERSION=${OPENGL_VERSION/*:/}

 

应该使用:

OPENGL_VERSION=$(glxinfo| grep "OpenGL version string:" | awk 'BEGIN { FS =":[[:space:]]+" }; { print $2 }')

  • 不要使用${foo:3[:1]}进行子串切割,使用echo, sed, grep,     awk等命令。

例如:

string_after="somestring"

string=${string_after:0:3}

 

应该使用:

string=$(echo$string_after | awk  '{ string=substr($0,1, 3); print string; }' )

  • 在case语句中使用[!]而不是[^]。例如:

case"foo" in

    [^f]*)

        echo 'not f*'

    ;;

esac

 

替换为:

case"foo" in

    [!f]*)

        echo 'not f*'

    ;;

esac

  • dash 不支持$LINENO,虽然它是POSIX标准。
  • 不要使用$PIPESTATUS
  • 避免使用$RANDOM,而应读取/dev/urandom或者/dev/random。例如:

random=`hexdump-n 2 -e '/2 "%u"' /dev/urandom`

  • 一些echo的选项不是portable的,可能其他shell不支持。例如-e, -n
  • 函数名前不要加function关键字。
  • 不要使用let命令,直接使用=赋值。例如

let time=10 和 time=10一样

let time--和time=$((time-1))一样

  • bash和dash对local关键字的解释不一样。

local a=5 b=6;   //dash:a和b是全局变量,  bash则认为a和b是局部变量。

  • 不支持printf %q|%b
  • 不要使用select关键字,只有bash才支持。
  • source命令也是bash才支持,应该使用'.'命令
  • 路径搜索时,`dash` 不支持     `~` 扩展,应该使用$HOME
  • 不支持declare 或 typeset
  • bash和dash对ulimit和type有不同的选项
  • time是bash内置的命令,但是在dash下需要使用time程序
  • kill -[0-9] or     -[A-Z]是bash内置的命令
  • 在bash里,如果read没有接变量,则会保存在REPLY变量里。在dash应该使用read REPLY替代。
  • 不要使用<<<,而是使用<<替代。例如:

$cat <<<"$HOME is where the heart is."

/home/ralphis where the heart is.

 

替换为:

$cat <

>$HOME is where the heart is.

>E

/home/ralphis where the heart is.

$

 


推荐阅读
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • 本文介绍了在Ubuntu系统中清理残余配置文件和无用内容的方法,包括清理残余配置文件、清理下载缓存包、清理不再需要的包、清理无用的语言文件和清理无用的翻译内容。通过这些清理操作可以节省硬盘空间,提高系统的运行效率。 ... [详细]
  • python3.7 安装pip3_python3的pip3安装
    ---恢复内容开始---pip3的安装需要对应一整套python的编译工具库,所以安装好的pip3是这个样子:inearAi:~$pip3-Vpi ... [详细]
  • Ubuntu18.04 安装ROS Melodic && Ros2 Dashing
    https:blog.csdn.netqq_44717317articledetails104547474一、Ubuntu18.04的安装ubuntu2go的制作关于Ubuntu2 ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
  • Ubuntu 用户安装 Linux Kernel 3.15 RC1
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • docker安装到基本使用
    记录docker概念,安装及入门日常使用Docker安装查看官方文档,在&quot;Debian上安装Docker&quot;,其他平台在&quot;这里查 ... [详细]
  • Docker安装Rabbitmq(配合宝塔)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker安装Rabbitmq(配合宝塔)相关的知识,希望对你有一定的参考价值。一、事前准备 ... [详细]
  • 导航:网站首页谁有大一C语言考试题?快考试了,跪求题库有谁会做C语言的题目谁有大一C语言考试题?快考试了,跪 ... [详细]
  • buildroot构建项目(一)buildroot介绍【转】
    转自:https:www.cnblogs.comkele-dadp8231434.html1.1什么是buildrootBuildroot是Linux平台上一个构建嵌入式Linux ... [详细]
author-avatar
那年磕长头
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有