Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 作为./script.sh和sh script.sh运行shell脚本有什么区别_Unix_Scripting_Shell - Fatal编程技术网

Unix 作为./script.sh和sh script.sh运行shell脚本有什么区别

Unix 作为./script.sh和sh script.sh运行shell脚本有什么区别,unix,scripting,shell,Unix,Scripting,Shell,我有一个像这样的脚本 #!/bin/bash function something() { echo "hello world!!" } something | tee logfile 我已经设置了这个文件的执行权限,当我尝试这样运行这个文件时 $./script.sh $sh script.sh 它运行得非常好,但是当我在命令行上像这样运行它时 $./script.sh $sh script.sh 它抛出了一个错误。为什么会发生这种情况?我可以用什么方法来解决这个问题

我有一个像这样的脚本

#!/bin/bash

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

something | tee logfile 
我已经设置了这个文件的执行权限,当我尝试这样运行这个文件时

 $./script.sh
$sh script.sh 
它运行得非常好,但是当我在命令行上像这样运行它时

 $./script.sh
$sh script.sh 

它抛出了一个错误。为什么会发生这种情况?我可以用什么方法来解决这个问题

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

您可以通过将其作为
bash script.sh
调用来修复它,或者如果它是您的机器,您可以将
/bin/sh
更改为bash,而不是它当前的状态(通常只需将其符号化-
rm/bin/sh&&ln-s/bin/bash/bin/sh
)。或者,如果已经可以使用,您也可以使用
/script.sh


如果您的shell确实是dash,并且您希望修改脚本以使其兼容,那么有一个关于差异的有用指南。在您的示例中,似乎只需删除function关键字。

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

只需从命令行启动它,就可以使用您所在的shell环境

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

但随机性取决于错误可能是什么:
第一行/bin/bash中指定的路径错误——可能是bash未安装?

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

/bin/bash myscript.sh
/bin/sh myscript.sh  
/bin/ksh myscript.sh etc 
顺便说一下,您也可以这样放置shebang(如果您不想指定完整路径)


不是shell读取脚本的第一行,而是通过exec()系统调用之一读取内核。更一般地说,内核在脚本的第一行上查找hash-bang构造,并运行该行上命名的解释器(即shell)(以及解释器后面的选项)。OP指定哈希爆炸是
#/bin/bash
,因此内核启动bash。同样,OP指定该文件是可执行的,这是
path/to/script.sh
所必需的,但不是
sh script.sh
所必需的。实际上,内核是解释shebang的人,而不是shell。如何处理作为
/script.sh
运行的脚本,取决于内核。在几乎所有情况下,如果第一行是hash-bang行,内核将启动该行上命名的解释器,并将脚本的路径名作为其下一个参数(在hash-bang行上提供的任何选项之后)。您可以运行任何shell(zsh、dash、ksh、fish、tcsh等),并且
path/to/script.sh
将使用哈希行中指定的解释器。