执行Bash Shell脚本的不同方法及其差异
下面是小型简单Shell脚本。
#!/bin/bash echo "This is our first script"
为了执行脚本,我们需要首先使用chmod + x <script>命令为脚本文件赋予可执行权限。
现在,让我们了解可用于执行此Shell脚本的不同方法。
执行shell脚本的第一种方法:
这种方法很简单。
只需在脚本文件名前添加./,如下所示。
root@localhost:~ # ./example_script.sh This is our first script
执行Shell脚本的第二种方法:
我们也可以提供脚本的绝对路径来执行它。
root@example:~ # /root/example_script.sh This is our first script
执行Shell脚本的第三种方法:
或者,我们可以在脚本文件名前添加命令bash
root@example:~ # bash example_script.sh This is our first script
执行Shell脚本的第四种方法:
我们甚至可以使用sh命令执行脚本(sh命令)
root@example:~ # sh example_script.sh This is our first script
执行Shell脚本的第五种方法:
还有另一种执行Shell脚本的方法,如下所示。
. ./example_script This is our first script
让我们分析上面显示的第一种方法。
第一种方法就像指定脚本本身的文件名一样简单。
实际上,第一种方法和第二种方法都是相同的。
第一种方法通过使用./example_script执行脚本,这意味着我们应该位于脚本所在的同一目录中。
.和..在linux操作系统中具有特殊含义。
“.”代表当前目录,“ ..”代表上一个父目录。
因此,如果要执行位于当前目录中的脚本,则可以通过./scriptfile轻松指定脚本名称。
因此,如果要在当前目录的父目录中执行脚本,则可以使用../scriptname执行它
如果我们不确定如何操作。
和..在linux中工作,那么我建议阅读以下有关linux中的inode的文章。
基本上 .具有当前目录的inode编号,而..具有先前父目录的inode编号。
请注意第一个事实 .方法(如果要执行位于父目录中的脚本,则为..方法)仅在已授予脚本文件可执行权限的情况下起作用。
所以 .方法,..方法,甚至指定脚本文件的完整绝对路径(/path/to/example_script)都在做同一件事(即:其指定脚本文件名。
绝对或者相对。
)
此处需要了解的另一件事是...这些指定脚本绝对路径或者相对路径的方法仅在脚本中包含shebang时才有效。
Shell脚本中的shebang是什么?
上面显示的示例脚本中的第一行称为shebang。
#!/bin/bash
#!是脚本开始的魔术代码。
如果需要,此魔术字符后面可以有空格。
但是紧随魔术字符之后的下一件事将被视为脚本的解释器。
第一行中指定的#!/bin/bash表示将使用“ bash shell”来解释脚本。
Linux中还有其他类似于bash的shell。
因此,如果我们将shebang #!/bin/bash作为脚本的第一行,则即使我们从任何其他shell执行脚本,bash也将用于执行脚本。
Bash shell二进制文件通常位于/bin目录中。
这就是为什么我们使用#!/bin/bash。
如果其他地方有bash shell二进制文件,则必须使用该二进制文件的绝对路径。
第三种方法(预先显示)在命令行本身中指定解释器。
如果我们在执行脚本时在命令行中指定解释器(即,上面的第三个方法,/bin/bash example_script.sh或者/bin/bash /path/to/example_script.sh),则将忽略shebang。
在这种情况下,将使用命令行中指定的解释器。
第四种方法与第三种方法完全相似。
这是因为此方法中使用的sh解释器(sh example_script.sh)在大多数情况下都与/bin/bash符号链接。
linux中的符号链接与Windows世界中的快捷方式非常相似。
使用此方法,我们可以使用另一个文件名从另一个位置访问一个文件。
基本上,链接文件将始终使用与其链接的原始文件。
[root@localhost ~]# cd /bin/ [root@localhost bin]# ls -l sh lrwxrwxrwx. 1 root root 4 Oct 7 2014 sh -> bash
从上面的ls -l输出中可以清楚地看到,sh符号链接到同一目录(即/bin)中的bash。
因此,在Red Hat操作系统家族中,无论是执行/bin/sh example_script.sh还是/bin/bash example_script.sh都无关紧要,因为两者都是一回事。
在某些Debian系列系统中,我们会看到/bin/sh被符号链接到/bin/dash(如下所示)。
root@localhost:~# cd /bin/ root@localhost:/bin# ls -l sh lrwxrwxrwx 1 root root 4 Nov 19 2014 sh -> dash
那么什么是破折号?
它是Debian发行家族使用的相对较新的shell。
DASH代表Debian Almquist shell。
与bashshell相比,它的重量实际上很轻。
与bash shell相比,DASH shell更快。
这是主要原因,Ubuntu和其他Debian发行版家族启动了/bin/sh到/bin/dash的默认符号链接。
这也改善了系统的启动时间(因为大多数启动脚本都使用/bin/sh。
由于现在已与/bin/dash符号链接,因此脚本现在将使用破折号shell而不是bash。
)
与bash shell相比,破折号没有太多功能。
它被设计为极轻,快速。
因此,建议使用/bin/dash测试脚本,以确保它也可以在破折号中使用。
执行shell脚本的第五种方法是。
./example_script.sh。
让我们考虑一个示例脚本,以进一步了解该方法。
下面显示了我们了解此方法的示例脚本(脚本文件名为test.sh)。
root@localhost:~# cat test.sh #!/bin/bash variable1=somevalue variable2=anothervalue echo "This is a example script"
可以通过在bash中使用=运算符来定义变量。
现在,我们仅定义了两个变量(变量1和变量2)。
值是somevalue和anothervalue1.
现在让我们使用./方法(即,我们在本文中学习的第一个方法)执行脚本。
root@localhost:~# ./test.sh This is a example script root@ip-10-12-2-73:~# echo $variable1 root@ip-10-12-2-73:~# echo $variable2
该脚本可以按要求完美地工作。
但是,在脚本执行后,变量不再可供我们访问。
这是因为触发了一个新的bash shell进程来执行脚本。
该脚本完成执行后,该shell进程将终止。
脚本中定义的变量对于执行我们当前的bash shell完全不可访问。
这就是为什么脚本完成执行后我们看不到variable1和variable2的值的原因。
如果要在当前shell进程中执行脚本(触发脚本将使用该脚本),则应使用以下方法。
root@ip-10-12-2-73:~# . ./test.sh This is a example script root@ip-10-12-2-73:~# echo $variable1 somevalue root@ip-10-12-2-73:~# echo $variable2 anothervalue root@ip-10-12-2-73:~#
从上面的示例中我们可以清楚地看到,即使脚本完成执行后,变量仍然可供我们使用。
所以可以使用. ./scriptfile方法。