+x 和 ./ 之间的区别 and sh ./

+x 和 ./ 之间的区别 and sh ./

使用以下脚本运行有什么实际区别吗?

[sudo] sh ./<script>.run

代替

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

答案1

如果你使用

sh ./<script>.run

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

如果你使用

./<script>.run

内核查看舍邦线找出要使用哪个程序来运行该程序。因此,即使它是 Bash、Perl、Python 或其他脚本,这种方法也能奏效。

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

答案2

只要它是一个sh(Dash,或同等的)shell 脚本,就没有外表上的区别。

问题是,.run并不能保证情况确实如此。它可能是二进制文件。它可能是 Bash 或 Python 或 PHP 或任何其他文件;它们都有一个 shell 脚本 hash-bang。如果你盲目地强行执行sh,谁知道会发生什么。它可能会出错,但它可能会在到达那一步之前意外运行有害代码。

通过chmod对其进行 ding(启用执行权限位)然后运行它./script.run,您可以为其提供最佳的运行可能性。如果它是一个 shell 脚本,它的 hash-bang 将被正确解析,如果它是一个二进制可执行文件,它将直接运行。

答案3

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

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

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

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

#!/usr/bin/python

print "This is a Python script!"

..那么这两个命令就有很大不同:

$ 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

答案4

[sudo] chmod +x ./<scrupt>.run使脚本可执行,以便您可以使用 运行它./<script>.run
即使[sudo] sh ./<script>.run它不可执行,您也可以使用 运行它。

相关内容