Answers:
如果您使用
sh ./<script>.run
/bin/sh
(通常是Bourne shell)将用于运行脚本。当然,这仅在脚本是为Bourne shell编写的情况下才有效。有时,Linux的Shell脚本需要Bash而不是Bourne shell,因此即使它是Shell脚本,也可能不起作用。
如果您使用
./<script>.run
内核看着shebang线以找出要使用哪个程序来运行该程序。因此,即使它是Bash,Perl,Python或其他脚本,此方法也可以工作。
因此,这通常是运行脚本的首选方式。
只要是sh
(破折号或等效的)shell脚本,否,就没有向外的区别。
问题是.run
不能保证确实如此。它可以是二进制的。它可以是Bash或Python或PHP或其他任何东西;它们都有一个shell脚本hash-bang。如果您盲目地通过它sh
,谁知道会发生什么。它可能会出错,但在达到目标之前可能会意外运行有害代码。
通过对其进行chmod
加密(以启用执行许可权位)然后运行它./script.run
,可以为它提供最佳的运行可能性。如果是shell脚本,则将正确解析其哈希爆炸;如果是二进制可执行文件,则将仅在本地运行。
这两种方法通常可以起到相同的作用,但有很大的不同。
sh ./script
sh
使用参数运行命令,该参数./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
一个重要的区别是您的hashbang行是否具有参数。例如,如果脚本以
#!/bin/bash -e
...并且您使用sh
或在外部运行它bash
,该行将被解释为注释并被忽略,因此-e
不会处理参数(失败时退出)。因此,给出以下脚本:
#!/bin/bash -e
echo Hello
false
echo goodbye
的输出./script
只是“ Hello”,而输出的后面sh script
将是,这可能不是故意的。Hello
goodbye
顺便说一句,这就是为什么您应该始终使用单独的set -e
语句的原因(无论如何,这是一个好主意-通常,如果中间脚本有问题,您将不希望其被忽略)。