问题
如果我写,#!/bin/bash
echo"foo"
或者#!/bin/sh
echo"foo"
两者都产生相同的结果,我看到有一些以#!/bin/sh或#!/bin/bash开头的脚本,他们之间有什么区别?
答案1
bash和sh是两个不同的shell,基本上bash就是sh,但具有更多的特性和更好的语法,
在大多数系统上/bin/sh是一个符号链接,并且不会调用sh,在Ubuntu /bin/sh中,链接到bash,Linux发行版上的典型行为,现在已经更改为链接到bash是最常用的shell,是Linux系统用户的默认shell,它是Unix历史中使用的其他shell的继承者,它的名字bash是Bourne-Again Shell的缩写,是对它旨在替代的Bourne Shell的致敬,尽管它还结合了CShell和Korn Shell的功能。
从/bin/bash ~bash的系统到这里都可以访问它。
问题是,不同的shell之间存在微小的不一致,当运行脚本时,这可能是一个真正的问题,bash拥有很多脚本特性,这些特性对于bash来说是独一无二的,对其他shell来说则不然。
脚本可以在第一行指定#!/bin/bash,这意味着脚本应该始终使用bash运行,而不是使用另一个shell。
/bin/sh是表示系统shell的可执行文件,在Linux发行版中,长期以来,这通常是bash的符号链接,以至于总是将/bin/sh链接到bash或与bash兼容的shell成为一种惯例。
编写脚本时应该使用什么
如果脚本只需要bash支持的特性,请使用#!/bin/bash。
但是,如果可能,最好确保你的脚本是POSIX兼容,并且使用#!/bin/sh,它应该始终非常可靠地指向任何安装中首选的POSIX兼容系统shell。
答案3
即使/bin/sh是指向/bin/bash的符号链接,#!/bin/sh也不完全等效于#!/bin/bash。
如果用sh调用bash,它试图尽可能地模仿历史版本的sh的启动行为,同时符合POSIX标准。"
例如,特定于bash的语法:exec > >(tee logfile.txt)
在以shell开头的#!/bin/sh中会给出错误,即使使用sh-> bash符号链接也一样。
相关文章