"#!/usr/bin/env ruby" vs. "#!/usr/bin/ruby"

2016 Dec 22

脚本文件(可执行的脚本文件)的第一行会有一个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的可移植性。

参考

Shebang (Unix)

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.