运行shell脚本为./script.sh和sh script.sh之间的区别是什么

时间:2010-03-18 07:28:59

标签: unix scripting shell

我有一个看起来像这样的脚本

#!/bin/bash

function something() {
 echo "hello world!!"
}

something | tee logfile 

我已经设置了此文件的执行权限,当我尝试运行这样的文件时

 $./script.sh

它运行得非常好,但是当我在命令行上运行它时,就像这样

$sh script.sh 

它引发了一个错误。为什么会发生这种情况,以及解决这个问题的方法是什么。

3 个答案:

答案 0 :(得分:23)

将其作为./script.sh运行将使内核读取第一行(shebang),然后调用bash来解释脚本。将其作为sh script.sh运行使用系统默认为sh的任何shell(在Ubuntu上这是Dash,它是sh兼容的,但不支持Bash的一些额外功能)。

您可以通过调用bash script.sh来修复它,或者如果它是您的计算机,您可以将/bin/sh更改为bash而不是当前的任何内容(通常仅通过符号链接 - {{1} })。或者你可以使用rm /bin/sh && ln -s /bin/bash /bin/sh代替,如果那已经有效了;)

如果您的shell确实是破折号,并且您希望修改脚本以使其兼容,https://wiki.ubuntu.com/DashAsBinSh提供了有用的差异指南。在您的示例中,您似乎只需删除函数关键字。

答案 1 :(得分:1)

如果您的脚本位于当前工作目录并且您发出./script.sh,则内核将读取shebang(第一行)并执行已定义的shell解释器。您也可以通过指定解释器的路径来调用script.sh,例如

/bin/bash myscript.sh
/bin/sh myscript.sh  
/bin/ksh myscript.sh etc 

顺便说一下,你也可以像这样把你的shebang(如果你不想指定完整路径)

#!/usr/bin/env sh

答案 2 :(得分:0)

sh script.sh强制脚本在sh - shell中执行。

只需从命令行启动它就会使用你所在的shell-environemnt。

请发布错误消息以获取更多答案。

随机但是错误可能是什么: 在第一行/ bin / bash中指定的路径是错误的 - 可能没有安装bash?