+ x和./ <script>和sh ./ <script>之间的区别


13

使用以下命令运行脚本之间是否有实际区别?

[sudo] sh ./<script>.run

代替

[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run

Answers:


18

如果您使用

sh ./<script>.run

/bin/sh(通常是Bourne shell)将用于运行脚本。当然,这仅在脚本是为Bourne shell编写的情况下才有效。有时,Linux的Shell脚本需要Bash而不是Bourne shell,因此即使它是Shell脚本,也可能不起作用。

如果您使用

./<script>.run

内核看着shebang线以找出要使用哪个程序来运行该程序。因此,即使它是Bash,Perl,Python或其他脚本,此方法也可以工作。

因此,这通常是运行脚本的首选方式。


1
正如我在olis答案中所说的那样:我检查了可执行文件,然后运行了shebang的/ bin / sh命令,因此它可能很好,请
耐心

7

只要是sh(破折号或等效的)shell脚本,否,就没有向外的区别。

问题是.run不能保证确实如此。它可以是二进制的。它可以是Bash或Python或PHP或其他任何东西;它们都有一个shell脚本hash-bang。如果您盲目地通过它sh,谁知道会发生什么。它可能会出错,但在达到目标之前可能会意外运行有害代码。

通过对其进行chmod加密(以启用执行许可权位)然后运行它./script.run,可以为它提供最佳的运行可能性。如果是shell脚本,则将正确解析其哈希爆炸;如果是二进制可执行文件,则将仅在本地运行。


啊,不知道谢谢您的回答,只是检查了我运行hash-bang的可执行文件是/ bin / sh,所以我认为它很好
user36976 2014年

1

这两种方法通常可以起到相同的作用,但有很大的不同。

sh ./scriptsh使用参数运行命令,该参数./script恰好执行给定脚本..即使脚本实际上不是sh脚本(错误)

./script执行给定的文件。它通过查找“ shebang”行来确定要运行的命令来完成此操作。如果未指定,则使用sh(这两种方法有时作用相同),但通常指定了不同的解释器。

例如,如果filename包含以下内容:

#!/usr/bin/python

print "This is a Python script!"

..then这两个命令是非常不同的:

$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!

如果没有shebang行,则两者相同:

$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script

1

一个重要的区别是您的hashbang行是否具有参数。例如,如果脚本以

#!/bin/bash -e

...并且您使用sh或在外部运行它bash,该行将被解释为注释并被忽略,因此-e不会处理参数(失败时退出)。因此,给出以下脚本:

#!/bin/bash -e
echo Hello
false
echo goodbye

的输出./script只是“ Hello”,而输出的后面sh script将是,这可能不是故意的。Hellogoodbye

顺便说一句,这就是为什么您应该始终使用单独的set -e语句的原因(无论如何,这是一个好主意-通常,如果中间脚本有问题,您将不希望其被忽略)。


0

没有

[sudo] chmod +x ./<scrupt>.run使脚本可执行,因此可以使用来运行它./<script>.run
使用[sudo] sh ./<script>.run它可以运行它,即使它不是可执行文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.