我有一个看起来像这样的脚本
#!/bin/bash
function something() {
echo "hello world!!"
}
something | tee logfile
我已经设置了此文件的执行权限,当我尝试运行这样的文件时
$./script.sh
它运行得非常好,但是当我在命令行上运行它时,就像这样
$sh script.sh
它引发了一个错误。为什么会发生这种情况,以及解决这个问题的方法是什么。
答案 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?