脚本文件(可执行的脚本文件)的第一行会有一个shebang,比如#!/bin/sh
,表示用哪个程序来执行该脚本。
每种可执行文件的开头会有一个相应的magic number。
可执行的脚本文件对应的magic number是0x230x21
,也就是ASCII码形式的#!
。
在shebang里使用env
可以增加脚本的可移植性。
比如#!/usr/bin/env ruby
相比于#!/usr/bin/ruby
有着更好的可移植性。
因为在某个系统上,ruby不一定安装在/usr/bin/
下,也有可能安装在/usr/local/bin/
等其它目录里。
而应用#!/usr/bin/env ruby
这种形式的shebang时,只要在执行脚本的用户的PATH
里能搜索到ruby程序,就可以执行脚本。
当用rbenv来管理ruby版本时,ruby程序一般会安装在用户目录下,然后rbenv通过设置用户的PATH
变量来找到需要的ruby版本。
这种情况下使用#!/usr/bin/env ruby
会保证脚本在执行时可以找到正确的ruby程序。
在绝大部分的系统上,env
都安装在/usr/bin/
目录下,所以不用担心/usr/bin/env
的可移植性。
参考
man env
env – set environment and execute command, or print environment
The env utility executes another utility after modifying the environment as specified on the command line.