gpt4 book ai didi

关于Bash脚本中Shebang的趣事

转载 作者:我是一只小鸟 更新时间:2023-05-07 22:31:17 28 4
gpt4 key购买 nike

哈喽大家好,我是咸鱼 。

不知道小伙伴们在写 Bash 脚本或者说看别人的 Bash 脚本的时候有没有注意过脚本的第一行 。

                        
                          #!/bin/bash

                        
                      

Bash 脚本的第一行往往以 #! 开头,这一行称作 shebang 行 。

在 类 UNIX 系统中,shebang 行用来指定脚本的解释器路径,通常出现在第一行,格式如下 。

                        
                          #! interpreter_path

                        
                      

shebang 行中开头 #! 字符的作用是告诉操作系统这不是一个普通二进制文件,而是需要通过解释器运行的东西 。

而这个解释器则通过 #! 字符后面来指定。例如 /bin/bash 表示使用 bash 解释器来执行该脚本文件 。

下面则是一些 Bash 脚本的 shebang 行,指定了不同的解释器 。

                        
                          #! /usr/bin/perl
#! /usr/bin/awk
#! /usr/bin/python

                        
                      

那么这时候小伙伴们可能就会有疑问: 我忘了加 shebang 行,脚本为什么还能执行?

如果一个脚本没有添加 shebang 行来指定解释器路径,则默认情况下系统会使用默认的 shell 来执行脚本,系统默认的 shell 可以通过下面的命令来查看 。

                        
                          # 一般情况下默认的 shell 为bash
echo $SHELL

                        
                      

现在我们知道了 shebang 行的作用,那么我们现在来编写一个脚本并修改 shebang 行试试 。

test.sh 内容如下:

                        
                          #!/bin/bash
echo Hello

                        
                      

先给 test.sh 脚本添加一下执行权限 。

                        
                          chmod +x test.sh

                        
                      

接下来我们用几种方式来执行这个脚本 可以看到脚本都成功执行了 。

下面我们来改一下 shebang 行,将其改成其他命令 。

                        
                          #!/usr/bin/ls -l
echo Hello

                        
                      

然后我们分别用几种方式来执行这个脚本 上面脚本执行的结果是不是看的一脸懵逼,说实话我一开始看到的时候也是很懵 。

我们先来看下这四种脚本执行方式的区别 。

  • bash tesh.sh

这种方式执行脚本的原理是将 test.sh 作为参数传给 bash 解释器(命令)来执行,而不是 test,sh 自己来执行 。

这种方式执行脚本不需要给脚本文件添加执行权限、不需要写 shebang 行指定解释器路径,因为脚本是作为参数被传给 bash 来执行 。

  • sh test.sh

这种执行脚本的方式跟上面的方式原理一样,都是将脚本作为参数传进去,只不过是这个方式用的是 sh 解释器(命令),而不是 bash 。

  • /root/test.sh

这种是通过绝对路径去执行脚本,通过绝对路径来执行脚本就需要脚本拥有执行权限 。

当使用绝对路径来执行脚本时,操作系统需要知道该脚本文件所使用的解释器类型,这就需要依靠脚本文件中的 shebang 行 。

实际上你用绝对路径执行脚本的时候,如果里面定义了 shebang 行(例如 #! /bin/bash ) 。

那么实际上跟下面的命令是一样的 。

                        
                          /bin/bash /root/test.sh

                        
                      

在执行脚本的时候,操作系统会读取脚本的 shebang 行 。

如果你的 shebang 行是其他 Linux 命令而不是解释器,那么就会导致操作系统将你的 shebang 行当作命令,而你的脚本则是命令的参数 。

就好比上面的例子,我将 shebang 行改成了 #! /usr/bin/ls -l ,当我执行脚本的时候其实就是下面这样的 。

                        
                          /usr/bin/ls -l /root/test.sh

                        
                      

这样会导致脚本无法执行 。

  • ./test.sh

这种是通过相对路径去执行脚本,跟上面用绝对路径执行脚本方式是一样的,只不过区别是一个是相对路径一个是绝对路径 。

总结:

  • shebang 行通常出现在 UNIX 系统的脚本当中,用来指定脚本的解释器路径,出现在第一行,以 #! 开头
  • 如果脚本里面没有定义 shebang 行,系统会去找默认的解释器,默认解释器用 echo $SHELL 查看
  • 用 bash 或者 sh 命令执行脚本的时候,其实是把脚本作为参数传给 bash 或 sh 命令了,这时候脚本可以不添加执行权限、可以不需要 shebang 行
  • 如果用绝对路径或者相对路径的方式来执行脚本,需要脚本拥有执行权限,如果 shebang 行定义的不是解释器而是其他命令,就会导致脚本无法执行

附上参考链接: Shebang Shenanigans :: Linus Karlsson 。

最后此篇关于关于Bash脚本中Shebang的趣事的文章就讲到这里了,如果你想了解更多关于关于Bash脚本中Shebang的趣事的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com