前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >脚本开头的#!是什么?到底该怎么写?

脚本开头的#!是什么?到底该怎么写?

作者头像
编程珠玑
发布2020-05-08 11:20:18
5.2K0
发布2020-05-08 11:20:18
举报
文章被收录于专栏:编程珠玑编程珠玑

shebang是什么?

在计算机领域中,Shebang(也称为Hashbang)是由井号和感叹号构成的字符序列:

代码语言:javascript
复制
#!

文件中存在shebang 的情况下,系统会分析shebang后的内容,并调用指定的解释器来解释执行文件的内容。

这个不用说想必大家也见过很多次了。

至于为什么叫这个名字,这里摘抄维基百科的解释:

Shebang的名字来自于SHArp和bang,或haSH bang的缩写,指代Shebang中#!两个符号的典型Unix名称。Unix术语中,井号通常称为sharp,hash或mesh;而叹号则常常称为bang。也有看法认为,shebang名字中的sh来自于默认shell————Bourne shell的名称,sh,因为常常使用shebang调用之。

作用是什么

作用大家应该也都知道了,指定解释程序,这一点在《为什么执行自己的程序要在前面加./》中也有更多解释,建议你参考阅读。

这里再举个小例子说明一下,假设文件test.txt内容为:

代码语言:javascript
复制
#!/bin/cat
hello 公众号编程珠玑

在linux下执行:

代码语言:javascript
复制
$ ./test.txt
#!/bin/cat
hello 公众号编程珠玑

其实等价于:

代码语言:javascript
复制
/bin/cat test.txt

所以不是说你的文件后缀是sh就是shell脚本,是py就是python脚本,linux下压根不认它们,这些扩展名只是给人看的,而不是给机器看的。 它们只认shebang,不认识的时候会被默认当成shell脚本。举例,下面的python代码如果没有加shebang:

代码语言:javascript
复制
print('hello world')

普通执行:

代码语言:javascript
复制
$ ./test.txt
./test.txt: line 1: syntax error near unexpected token `'hello world''
./test.txt: line 1: `print('hello world')'

看,被当成普通shell脚本了。

该怎么写?

shebang的写法很多,包括但不限于:

代码语言:javascript
复制
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -

上面这些写法通常都不会影响脚本的运行,但是它们有什么区别?推荐哪种写法呢?

从上面的写法中可以看到,都指定了bash或者sh的路径,但是不同的系统中,它们的路径可能不一样,而为了移植性考虑,建议选择第一种写法,它使用的是环境变量中配置的bash路径,而不是像其他写法那样,属于写死的路径。

这一点用于Python或者其他脚本语言也是成立的:

代码语言:javascript
复制
#!/usr/bin/env python3
print("hello 公众号编程珠玑")

总结

对于脚本类程序,shebang是必要的,因为它告诉系统应该如何来解释运行程序,当然你也可以运行时指定,但总归不是万全之策。至于写没有完全的对错之分。

关于本文的扩展内容,建议阅读《为什么执行自己的程序要在前面加./》。

你通常都是怎么写的?欢迎留言。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 作用是什么
  • 该怎么写?
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档