我写了一个简单的脚本。当我运行 时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
,即perl
或python
。但如果脚本以正确的权限运行,则会显示脚本的名称。
笔记:如果您想分发一个可供所有人访问的脚本,请创建一个手册页和一个 deb 包来安装它。我们需要减少在线随机脚本的数量并增加可以卸载的 deb 数量。
答案2
简短版本:
sh
是命令行解释器 (dash)。
运行后sh my_script
dash 会解释脚本。./
通过查看第一行来尝试找出要使用的解释器。例如#!/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 满足的依赖关系,但实际使用的解释器却不存在。