Bash

您所在的位置:网站首页 php运行shell命令 Bash

Bash

2023-05-16 07:40| 来源: 网络整理| 查看: 265

此條目可参照英語維基百科相應條目来扩充。若您熟悉来源语言和主题,请协助参考外语维基百科扩充条目。请勿直接提交机械翻译,也不要翻译不可靠、低品质内容。依版权协议,译文需在编辑摘要注明来源,或于讨论页顶部标记{{Translated page}}标签。 BashBash會話的截圖原作者布萊恩·福克斯首次发布1989年6月8日,​33年前​(1989-06-08)目前版本5.2.15 (2022年12月13日;穩定版本)[1] 源代码库git.savannah.gnu.org/cgit/bash.git 编程语言C語言操作系统 Unix-like,[2] macOS(系統包括較舊的GPLv2版本;當前版本可通過第三方獲得)[3] Windows(透過WSL提供,為較新的GPLv3+版本)[4][5] 系統平台GNU语言多語言(gettext)类型Unix shell、命令語言(英语:command language)许可协议GPLv3+[6]网站www.gnu.org/software/bash/

Bash,Unix shell的一種,在1987年由布萊恩·福克斯為了GNU計劃而编写。1989年釋出第一個正式版本,原先是計劃用在GNU作業系統上,但能运行于大多数类Unix系统的操作系统之上,包括Linux與Mac OS X v10.4起至macOS Mojave都將它作為預設shell,而自macOS Catalina,預設Shell以zsh取代。

Bash是Bourne shell的後繼相容版本與開放原始碼版本,它的名稱來自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。

Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。

一个名为Shellshock的安全漏洞在2014年9月初被发现,并迅速导致互联网上的一系列攻击。这个漏洞可追溯到1989年发布的1.03版本。

目录 1 历史 2 语法与特性 2.1 花括号扩展 2.2 使用整数 2.3 输入输出重定向 2.4 进程内的正则表达式 2.5 转义字符 2.6 关联数组 2.7 移植性 2.8 键盘快捷键 2.9 进程管理 2.9.1 批处理模式 2.9.2 并发模式 2.9.3 查看进程状态 3 启动脚本 3.1 Bash与Bourne shell和csh启动脚本的比较 3.1.1 设置可继承的环境变量 3.1.2 别名和函数 3.1.3 登录与登出时执行的命令 3.1.4 兼容旧环境的Bash启动脚本示例 3.2 Bash 启动脚本与操作系统相关的问题 4 参见 5 脚注 6 外部链接 历史[编辑]

由于理查德·斯托曼对于之前一位开发者的进度不满,布莱恩·福克斯从1988年1月10日开始开发Bash。斯托曼和自由软件基金会希望到一个能够运行已有的shell脚本的自由软件。他们把这看作是建成一个基于BSD和GNU的完全自由的操作系统的战略的重要部分。这是他们自己注资的几个项目之一。福克斯作为自由软件基金会的雇员承担这项工作。1989年6月8日,福克斯发布Bash的beta版本,版本号为.99。在福克斯离开于1992年中期到1994年中期的某个时候离开自由软件基金会之前,他一直担任Bash的主要维护者。之后,他的工作被传递给另一个早期贡献者,切特·雷米(Chet Ramey)。

从那时起,在Linux用户当中sh在很大度上成为最流行的shell,并成为许多Linux发行版默认的交互式shell(不过Almquist shell可能是默认的脚本shell)。在苹果公司的 OS X 操作系统上也是如此。Bash 也被移植到 Microsoft Windows(通过Cygwin和MinGW)。通过DJGPP项目,Bash被移植到了DOS。通过许多终端模拟软件,Bash被移植到Novell NetWare和Android。微软在2016年的Build大会上宣布,Windows 10 添加一个Linux子系统,完全支持Bash和其他Ubuntu下的二进制程序。

2014年9月24日,Stephane Chazelas,一位工作于英国,致力于Unix/Linux和网络通信方面的专家,发现Bash的一个安全漏洞。这个漏洞被命名为Shellshock,并被分配编号 CVE-2014-6271、CVE-2014-6277、CVE-2014-7169。这个漏洞非常严重,因为使用Bash的CGI脚本会变得脆弱,使得攻击者可以执行任意的代码。这个漏洞与Bash通过环境变量把函数定义传递给shell子进程的方式有关。

语法与特性[编辑]

bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有那些引用了Bourne特殊变量或使用了Bourne的内置命令的脚本才需要修改。bash的命令语法很多来自Korn shell(ksh)和C shell(csh),例如命令行编辑,命令历史,目录栈,$RANDOM和$PPID变量,以及POSIX的命令置换语法:$(...)。作为一个交互式的shell,按下TAB键即可自动补全已部分输入的程序名,文件名,变量名等等。

使用'function'关键字时,Bash的函数声明与Bourne/Korn/POSIX脚本不兼容(Korn shell 有同样的问题)。不过Bash也接受Bourne/Korn/POSIX的函数声明语法。因为许多不同,Bash脚本很少能在Bourne或Korn解释器中运行,除非编写脚本时刻意保持兼容性。然而,随着Linux的普及,这种方式正变得越来越少。不过在POSIX模式下,Bash更加符合POSIX。

bash的语法针对Bourne shell的不足做了很多扩展。其中的一些列举在这里。

花括号扩展[编辑]

花括号扩展是一个从C shell借鉴而来的特性,它产生一系列指定的字符串(按照原先从左到右的顺序)。这些字符串不需要是已经存在的文件。

$ echo a{p,c,d,b}e ape ace ade abe $ echo {a,b,c}{d,e,f} ad ae af bd be bf cd ce cf

花括号扩展不应该被用在可移植的shell脚本中,因为Bourne shell产生的结果不同。

#! /bin/sh # 传统的shell并不产生相同结果 echo a{p,c,d,b}e # a{p,c,d,b}e

当花括号扩展和通配符一起使用时,花括号扩展首先被解析,然后正常解析通配符。因此,可以用这种方法获得当前目录的一系列JPEG和PEG文件。

ls *.{jpg,jpeg,png} # 首先扩展为*.jpg *.jpeg *.png,然后解析通配符 echo *.{png,jp{e,}g} # echo显示扩展结果;花括号扩展可以嵌套。

除了列举备选项,还可以用“..”在花括号扩展中指定字符或数字范围。较新的Bash版本接受一个整数作为第三个参数,指定增量。

$ echo {1..10} 1 2 3 4 5 6 7 8 9 10 $ echo file{1..4}.txt file1.txt file2.txt file3.txt file4.txt $ echo {a..e} a b c d e $ echo {1..10..3} 1 4 7 10 $ echo {a..j..3} a d g j

当花括号扩展和变量扩展一起使用时,变量扩展解析于花括号扩展之后。有时有必要使用内置的eval函数

$ start=1; end=10 $ echo {$start..$end} # 由于解析顺序,无法得到想要的结果 {1..10} $ eval echo {$start..$end} # 首先进行变量扩展的解析 1 2 3 4 5 6 7 8 9 10 使用整数[编辑]

与Bourne shell不同的是bash不用另外生成进程即能进行整数运算。bash使用((...))命令和$[...]变量语法来达到这个目的:

VAR=55 # 将整数55赋值给变量VAR ((VAR = VAR + 1)) # 变量VAR加1。注意这里没有'$' ((++VAR)) # 另一种方法给VAR加1。使用C语言风格的前缀自增 ((VAR++)) # 另一种方法给VAR加1。使用C语言风格的后缀自增 echo $((VAR * 22)) # VAR乘以22并将结果送入命令 echo $[VAR * 22] # 同上,但为过时用法

((...))命令可以用于条件语句,因为它的退出状态是0或者非0(大多数情况下是1),可以用于是与非的条件判断:

if((VAR == Y * 3 + X * 2)) then echo Yes fi ((Z > 23)) && echo Yes

((...))命令支持下列比较操作符:'==', '!=', '>', '=',和'



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3