dbaplus社群 2024年08月16日
为什么 shell 脚本的开头要写 #!/bin/bash
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文解释了脚本文件开头#!/bin/bash的含义及作用,包括shebang的名称由来、指定解释器的多种写法、不同情况下脚本的执行方式等内容。

🧐#!被称为shebang,#的英文是sharp,!常被引用为炸弹(bang),所以sharp+bang简读为shebang。后面的/bin/bash是Bash Shell的二进制执行文件路径,#!/bin/bash用于指定默认运行脚本的解释器。

🎯脚本开头可根据指定的解释器有多种不同写法,如#!/bin/sh、#!/usr/bin/perl等,且#!后给出的路径名必须正确,否则会出现错误消息。

🤔以#!/bin/bash开头的脚本,内核会用/bin/bash来解释并运行脚本。若不写shebang,系统会用默认的bash执行脚本,作者的系统默认bash是zsh。此外,shebang行还可以是其他可执行命令,如#!/bin/cat,它会使脚本用该命令运行并显示内容。

小盒子的技术分享 2024-08-03 08:02 广东

天天都要用,但你知道为什么吗?

我们通常看到的脚本文件总是有以下这样的开头:


#!/bin/bash


本文解释一下这是什么,以及为什么要写它。


首先解释一下 #! ,因为 #!有个专有的名词,叫 shebang


发音类似中文的 “蛇棒” 。为什么叫 shebang 呢?首先 # 的英文是 sharp, 而 感叹号 ! 经常被引用为炸弹,炸弹爆炸就是 bang , 所以  sharp+bang,简读为 shebang



后面的 /bin/bash 就比较熟悉了,它是 Bash Shell 的二进制执行文件路径。是 Unix 类操作系统中最常用的 Shell 程序之一。


所以  #!/bin/bash  的作用是:用于指定默认情况下运行指定脚本的解释器


当脚本以 #!/bin/bash 开头时,内核就知道用 /bin/bash 这个可执行文件来解释并运行这个脚本。


既然是指定一个解释器,那么这个开头就可以根据你指定的解释器有多种不同写法了,比如:


#!/bin/sh#!/bin/bash#!/usr/bin/perl#!/usr/bin/tcl#!/bin/sed -f#!/usr/awk -f


上边每一个脚本头的行都指定了一个命令解释器,注意:#! 后边给出的路径名必须是正确的,否则将会出现一个错误消息,通常是"Command not found"


如果是/bin/sh,那么就是默认 shell(在 Linux 系统中默认是 Bash)。使用#!/bin/sh,在大多数商业发行的 UNIX 上,默认是 Bourneshell,这将让你的脚本可以正常的运行在非 Linux 机器上,虽然这将会牺牲 Bash 一些独特的特征


例子


假设我们有一个名为 “shell_script” 的脚本文件,文件内容如下


#!/bin/bash


然后我们准备执行这个文件


$ chmod u+x shell_script

$ ./shell_script


当我们执行  ./shell_script 这行命令的时候由于脚本添加了 shebang,相当于在命令行这样执行:


/bin/bash shell_script


你可能会有疑问:我写的脚本里面没有 shebang ,它也能正常执行啊?


是的,这是由于如果你不指定解释器,它就会去找系统默认的 bash ,你可以看一下你系统默认的 bash 是什么


我的是 zsh , 因为这是我设置的 (echo $0 打印当前使用的 shell)


echo $0/bin/zsh


也就是说,如果我不写 shebang ,那么系统会用正在运行的 zsh 来执行脚本 。


源码的解释是这样的:



有趣的地方


有时候 shebang 行不必具有 shell 的可执行文件。它可以是任何东西。


例如,我将#!/bin/zsh替换为#!/bin/cat,cat 命令将成为 shell 的解释器。


 ./shell_script#!/bin/cat
hello world


这意味着现在这个脚本将使用 cat 命令运行并显示脚本的内容。它将输出脚本所有内容。只要它指向一个可执行命令,它就会工作。如果你随便放一些不存的命令,它会抛出错误。


当然这些逻辑也是 C 函数来实现的



>>>>

参考资料



作者丨小盒子的技术分享

来源丨公众号:小盒子的技术分享(ID:xiaohezi_share)

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn



跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

脚本文件 shebang 解释器 Bash Shell
相关文章