Answers:
通过将文件名传递给脚本解释器程序来运行任何脚本时,正在运行解释器程序,并将脚本作为传递给它的参数。例如,这看起来像带有参数“ 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
这实际上是使用具有正确权限的爆炸句的实际好处-全部与部署有关。如果用户必须记住运行脚本的程序,那么很难使用户运行脚本。请记住,每次他们要运行脚本时,都要为其提供完整路径。/usr/local/bin
例如,将其放到哪里并使其可执行,可以为尝试使用您的脚本的人们节省很多麻烦。然后,这些程序将对计算机上的所有用户可用。
这也有利于识别。如果你进入的top
程序,没有爆炸线脚本运行将只具有的解释,即名称bash
,perl
或python
。但是,如果以正确的权限运行脚本,则会显示脚本的名称。
注意:如果要分发每个人都可以访问的脚本,请创建一个手册页和一个deb软件包以进行安装。我们需要减少在线随机脚本的数量,并增加可以卸载的deb的数量。
bash
不是sh
。
PATH
。
/usr/local/bin
可能会更好/usr/sbin
-它表明该程序在此计算机上本地而不是在发行版中。
简短版本:
sh
是命令行解释器(破折号)。
运行sh my_script
使破折号解释脚本。
./
尝试通过查看第一行来找出要使用的解释器。例如#!/bin/bash
,甚至#!/bin/ruby
(相对于运行ruby my_script
)。
./
找到任何东西,而是系统执行方法查看文件的前两个字节。
sh
并且文件中包含有爆炸声时,是否意味着该爆炸声将被忽略,还是会在sh
链接也打开外壳的地方打开外壳,然后打开其他外壳?
您可能会收到错误的三个主要原因:
chmod +x <myscriptname.sh>
来修复noexec
”)/usr/local/bin
#!
行有错误,请#!/bin/sh
或#!/bin/bash
如果您的第一行看起来正确,但仍然无法正常工作,请确保该文件没有DOS行尾。
该错误看起来像这样:
$ ./myscript.sh
bash: ./myscript.sh: /bin/bash^M: bad interpreter: No such file or directory
您可以通过运行来解决它dos2unix <myscriptname.sh>
,或者如果没有的话可以解决它
perl -p -i -e 's/\r\n$/\n/' <myscriptname.sh>
。
mkdir ~/bin ; cp myscript.sh ~/bin/
echo "export PATH="$PATH:/home/$USER/bin" >> ~/.profile ; source ~/.profile ;
不/usr/sbin
,那是不必要的行政手段,/usr/local/bin
是一个更好的选择,如果你不希望有一个~/bin/
,但避免sudo
尽可能多的建议。
~/.profile
已经具有用于添加的代码~/bin
(如果存在)PATH
。另外,请不要在脚本上添加扩展名。
ls ~/bin/|wc -l = 428
)我在里面放了很多东西;)
/bin
和/usr/bin
你会看到他们不使用扩展。