我正在学习一些shell脚本教程,并发现了以下示例程序:
#!/bin/sh
clear
echo "HELLO WORLD"
请问有人可以告诉我在开头的注释#!/bin/sh
的重要性是什么吗?
我正在学习一些shell脚本教程,并发现了以下示例程序:
#!/bin/sh
clear
echo "HELLO WORLD"
请问有人可以告诉我在开头的注释#!/bin/sh
的重要性是什么吗?
这被称为shebang,并告诉父shell使用哪个解释器来执行脚本。
#!/bin/sh <--------- bourne shell compatible script
#!/usr/bin/perl <-- perl script
#!/usr/bin/php <--- php script
#!/bin/false <------ do-nothing script, because false returns immediately anyways.
大多数脚本语言往往将以#
开头的行解释为注释,并会忽略后面的!/usr/bin/whatever
部分,否则可能会在解释语言中导致语法错误。
exec()
系统调用。 - tripleee当你尝试在Unix中运行一个程序(具有可执行位),操作系统会查看文件的前几个字节。这些字节构成了所谓的“魔数”,可以用来确定程序的格式以及如何执行它。
#!
对应的魔数是0x2321(请在ASCII表中查找)。当系统看到该魔数时,它知道正在处理一个文本脚本,并读取到下一个\n
(有一个限制,但我现在想不起来了)。通过识别解释器(shebang后面的第一个参数),它将调用解释器。
其他文件也有魔数。尝试使用less
查看位图(.BMP)文件,您将看到前两个字符是BM
。这个魔数表示该文件确实是一个位图。
#!/bin/sh
或#!/bin/bash
必须是脚本的第一行,因为如果你不在第一行使用它,系统将会把该脚本中所有命令都视为不同的命令。如果第一行是#!/bin/sh
,则系统将会将所有的命令都视为一个脚本,并且在ps
命令中显示该文件正在运行,而不是文件内部的命令。
./echo.sh
ps -ef |grep echo
trainee 3036 2717 0 16:24 pts/0 00:00:00 /bin/sh ./echo.sh
root 3042 2912 0 16:24 pts/1 00:00:00 grep --color=auto echo
ps
,以及类似 #!/bin/sh
的代码摘录。 - the Tin Man