第一行的 #!/bin/bash 是什么意思?它是否只是一个注释,并且像程序中的所有其他注释一样被 shell 忽略
或者
解释器仅解释这一行,并且忽略从 # 开始的所有其他行(除了 #!/bin/bash 之外)。
答案1
第一行告诉计算机在执行文件时使用哪个解释器
假设你使用 python 编写一个脚本,在运行这个脚本时,你将使用 python 解释器,计算机如何知道要使用哪个解释器,它会通过这一行知道,也称为舍邦,对于蟒蛇
#!/usr/bin/env python
print "Hello world"
再次假设您在 bash 中编写了一个脚本,并使用 bash 脚本的 shebang 告诉计算机在执行此代码时使用 bash 解释器
#!/usr/bin/bash
echo "Hello world"
答案2
以 开头的第一行#!
(在 Linux 上)由Linux内核里面的实施执行(2)系统调用(对于大多数命令,您的 shell 在 之后调用fork
- 这些命令不是函数,也不是 shell 内置命令)。
您可以提及其他可执行文件的绝对路径(例如/usr/bin/env
,请参阅环境(1))。作为一个愚蠢的示例,尝试制作一个包含唯一行的脚本#!/bin/cat /proc/self/maps
,然后使该脚本可读且可执行(使用chmod a+rx
),然后运行它。
POSIXexecve
规格没有提到任何舍邦特定的处理,但是我工作过的所有类 Unix 系统(Linux、SunOS、HPUX、AIX...)确实在execve
解释bash
器会跳过该行,就像以 , 开头的任何其他行一样#
,作为注释。
另请参阅binfmt_misc(Linux 特定)。
答案3
强制脚本使用 bash shell 运行,而不是当前使用的 shell。