运行脚本 ./ 和 sh 有什么区别?

运行脚本 ./ 和 sh 有什么区别?

我写了一个简单的脚本。当我运行 时sh <myscriptname.sh>,我得到了正确的输出,但是当我运行 时./<myscriptname.sh>,我得到了一个错误。

sh当我做和时有什么区别./

答案1

当您通过将文件名传递给脚本解释程序来运行任何脚本时,您正在运行解释程序,并将脚本作为参数传递给它。例如,这看起来像带有参数“filename.sh”的进程“sh”。解释器sh正在打开文件。

另一方面,如果您运行脚本本身,系统将调用指定的解释程序并输入脚本内容。在这种情况下,该过程看起来像没有参数的“filename.sh”。

你应该确保你有一条爆炸线:

#!/bin/bash
# bash script here

一条爆炸线是第一行在脚本中,以相同的两个字符开头#!,这些是系统在尝试执行脚本时读取的内容,然后系统立即将脚本传递给程序。请注意,此行与 bash 无关,并且对 python 和 perl 也同样有效,即使它们是非常不同的语言。您可以使用#!/usr/bin/python例如,然后在其后跟上 python 代码。

获得脚本后,请确保已设置执行权限:

chmod a+x filename.sh

然后您可以将脚本作为其自己的进程运行:

./filename.sh

或者将文件放入一个具有好听的程序名的已知位置,然后/usr/sbin从任何地方运行:

sudo cp filename.sh /usr/sbin/program-name
program-name

这确实是实际的使用具有正确权限的 bang line 的好处 - 这一切都是关于部署。如果用户必须记住用什么程序来运行脚本,那么让他们运行脚本是非常困难的。每次他们想要运行脚本时,请记住给出脚本的完整路径。而将脚本放入其中/usr/local/bin并使其可执行,可以为试图使用脚本的人省去很多麻烦。然后这些程序就可以供全部您计算机上的用户。

这也有利于识别。如果您进入程序top,运行没有感叹号的脚本将只显示解释器的名称bash,即perlpython。但如果脚本以正确的权限运行,则会显示脚本的名称。

笔记:如果您想分发一个可供所有人访问的脚本,请创建一个手册页和一个 deb 包来安装它。我们需要减少在线随机脚本的数量并增加可以卸载的 deb 数量。

答案2

简短版本:

  • sh是命令行解释器 (dash)。
    运行后sh my_scriptdash 会解释脚本。

  • ./通过查看第一行来尝试找出要使用的解释器。例如#!/bin/bash,甚至#!/bin/ruby(而不是运行ruby my_script)。

答案3

你所做的不同之处在于,

  • 使用sh,你正在运行一个程序,它将解释脚本中的行,就像你在终端的交互式提示中输入它们一样,

  • ./正在创建一个快捷方式,假设脚本就在你当前所在的目录中,并且它是可执行的(因为例如你发出了chmod +x myscript.sh),为你将来节省了宝贵的时间:-)

答案4

答案是 sh 是一个非常流行的 shell 的名称。但已过时并被其他 shell 取代。如今,sh 与机器上安装的其他 shell 相关联。例如,我将 bash 放在那里。从 sh 运行任何 shell 通常会触发与原始“shell”行为的一些“兼容”模式。

所以解决方案很简单。查看 sh 命令后面的内容(ls -al /bin/sh),并将 #!/bin/whatever_you_find_there 放在第一行(或者,如果脚本中有类似内容,请编辑它)。

或者脚本本身可能存在一些错误。例如 sh 满足的依赖关系,但实际使用的解释器却不存在。

相关内容