曾经遇到一个perl脚本,想在启动perl前置一个环境变量:
test.pl:
#!/usr/bin/env LC_CTYPE=zh_CN.UTF-8 perl
print "hello/n"
perl test.pl 可以正常运行,./test.pl就不会正常执行,且不会退出。
strace 可以看到程序在不停的 execve("./test.pl", ["./test.pl"]
原因就在于linux上脚本第一行解释器之后只能有一个参数,如果有多个也只做为一个。
直接运行 ./test.pl 相当于
/usr/bin/env "LC_CTYPE=zh_CN.UTF-8 perl" ./test.pl
evn会先设置LC_CTYPE="zh_CN.UTF-8 perl"这样一个环境变量,然后运行 ./test.pl,这就回到了最开始,于是一不断重复这个过程,不退出。
perl test.pl 可以正常运行是因为对于perl解释器来说,第一行只是一行注释。
切记切记:linux上脚本第一行解释器之后的参数都将做为一个参数传入到解释器中。
ps:
其实不认为第一行写 #!/usr/bin/evn interpreter 这种方法好,因为这种方法对于 awk, expect 等要加一个 -f 来指明脚本的就不好使了。