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

Vis*_*lvi 81 command-line scripts executable

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

when I dosh和 和有./什么不一样?

Mar*_*mo- 70

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

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

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

#!/bin/bash
# bash script here
Run Code Online (Sandbox Code Playgroud)

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

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

chmod a+x filename.sh
Run Code Online (Sandbox Code Playgroud)

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

./filename.sh
Run Code Online (Sandbox Code Playgroud)

或者将文件放在一个已知的位置,并使用一个很好的程序名称,比如/usr/sbin从任何地方运行:

sudo cp filename.sh /usr/sbin/program-name
program-name
Run Code Online (Sandbox Code Playgroud)

这确实是使用具有正确权限的 bang 线的实际好处 - 这一切都与部署有关。如果用户必须记住用什么程序运行脚本,就很难让用户运行脚本。每次他们想运行它时,请记住提供脚本的完整路径。/usr/local/bin例如,将它放入并使其可执行,可以为尝试使用您的脚本的人们节省大量的痛苦。然后这些程序可供使用您计算机上的所有用户使用。

这也有利于识别。如果你进入top程序,一个没有 bang 行的脚本运行将只有解释器的名称 ie bashperl或者python。但是,如果脚本以正确的权限运行,则会显示脚本的名称。

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

  • 不要在脚本上放置扩展名,尤其是当你把它放在 `PATH` 中时。 (2认同)

Ste*_*zzo 44

简短版本:

  • sh是命令行解释器(破折号)。
    运行sh my_script使 dash 解释脚本。

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

  • 绝对地。这里有一个 [很长的解释](http://www.linfo.org/dot_slash.html)。我很务实:) (10认同)
  • 它并不是真正的`./` 找到任何东西,它是系统执行方法,它查看文件的前两个字节。 (8认同)

med*_*duz 8

你所做的不同之处在于,

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

  • ./你正在做一个快捷方式假设脚本只是这里在当前目录下你坐在这将是可执行文件(因为比如你发出chmod +x myscript.sh),节省您的宝贵时间,将来时间:-)

  • +1 是唯一一个简明扼要地声明该文件必须是可执行的。 (4认同)
  • 请注意,使用 `sh` 文件不一定是可执行的。 (3认同)