首页 > 其他分享 >关于 Bash 脚本中 Shebang 的趣事

关于 Bash 脚本中 Shebang 的趣事

时间:2023-05-07 19:55:53浏览次数:53  
标签:趣事 脚本 解释器 shebang Shebang sh bash 执行 Bash

哈喽大家好,我是咸鱼

不知道小伙伴们在写 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

标签:趣事,脚本,解释器,shebang,Shebang,sh,bash,执行,Bash
From: https://www.cnblogs.com/edisonfish/p/17379964.html

相关文章

  • 重装系统后右键没有git bash here解决办法
    解决电脑右键没有GitBashHere问题1.按下win+r,输入‘regedit’,打开注册表2、找到[HKEY_CLASSES_ROOT\Directory\Background]。3、在[Background]下如果没有[shell],则右键-新建项[shell]。4、在[shell]下右键-新建项[GitBashHere],其值为“GitBashHere",此为右键菜单显示名......
  • xshell登录服务器提示符显示-bash-4.2#解决方法
    xshell登录服务器提示符显示-bash-4.2#解决方法突然发现root登录的xshell的终端提示符显示的是-bash-4.2#而不是root@主机名+路径的显示方式。搞了半天也不知道为什么出现这种情况。今天终于搞定这个问题,原因是root在/root下面的几个配置文件丢失,丢失文件如下:1、.bash_pro......
  • Bash Commands and Shell Scripts
    为了考试准备一下吧这门课对这个领域的知识教的太浅,考的却很难,必须要额外自学一点东西VariablesinShellScripts首先是ShellScripts中的变量概念:ShellScripts中的变量只有一种类型stringDefinevariableinshellscripts对于一个变量赋值语句a=xxx,xxx必须是字......
  • bash算术求值和errexit陷阱
    原文:https://www.technovelty.org//linux/bash-arithmetic-evaluation-and-errexit-trap.html在"trapsfornewplayers"一章:count=0things="01001"foriin$things;doif[$i=="1"];then((count++))fidone......
  • Linux shell script shebang env All In One
    LinuxshellscriptshebangenvAllInOne指定shellscript的运行环境shellscriptshebangenvhashbangenv#!\usr\bin\envbash❌#!\usr\bin\envbash#❌#!/usr/bin/env✅#!/usr/bin/envbash✅demos#!/usr/bin/envbash#✅exportN=1#case1......
  • Bash—source命令&export命令&bashrc文件
    当不使用source命令执行脚本时,会创建一个子shell,在该子shell中执行完脚本后退出子shell。不是用export定义的变量只对该shell有效,对子shell是无效的。如下图所示,一开始VA没有用export定义,所以第一次执行test.sh脚本时子shell访问不到父shell定义的VA,输出空......
  • Cygwin、MSYS2 Bash封装函数restart,重启Windows程序进程向导,输入序号一键重启对应进程
    概述作用:终端输入restart,根据菜单提示输入序号重启特定的软件或进程,定义的重启函数太多不便于记忆的情况,特别是手机远程终端(如:JuiceSSH)连接的情况下,减少手动输入和误操作,其中判定浏览器进程使用了另一篇文章中预定的函数wmicps,ps2为指向wmicps的alias(详见:https://www.cnblog......
  • 【ChatGPT】GPT-3.5 能理解 Bash 吗?与 ChatGPT AI 结对编程
    目录用ChatGPT和Bash脚本进行实验第一次尝试——ChatGPT试图解决这个问题第二次尝试——ChatGPT纠正了自己的错误第三次尝试——ChatGPT再次尝试如果一开始你没有成功......至少你会学到一些东西总结在过去的几个星期,我们已经听到了很多关于人工智能和自然语言处理的消息—......
  • Bash 中的特殊字符大全
    Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好,往往能给我们起到事半功倍的效果,为此,特地将Shell里面的一些符号说明罗列成对照表的形式,以便快速的......
  • 为Helm生成针对于bash shell的自动补全脚本,helm命令补全
    在当前shell会话中加载自动补全:source<(helmcompletionbash)为每个新的会话加载自动补全,执行一次:helmcompletionbash>/etc/bash_completion.d/helm ......