linux - #!/usr/bin/env
Description
在linux的一些脚本,需在开头一行指定脚本的解释程序。
#!/usr/bin/env bash #lends you some flexibility on different systems
#!/usr/bin/bash #gives you explicit control on a given system of what executable is called
#!/usr/bin/env python #这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。
#当系统看到这一行的时候,首先会到env设置里查找python的安装路径,
再调用对应路径下的解释器程序完成操作。
#!/usr/bin/python #告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;
#!/usr/bin/env -S -P /usr/local/bin:/usr/bin:${PATH} perl
#加上-P参数来指定一些目录去寻找perl这个程序,
#在/usr/local/bin和/usr/bin和PATH变量中定义的目录下寻找perl。
手册的定义
env - run a program in a modified environment
Distinguish
脚本用env启动的原因,是脚本解释程序在linux中可能被安装于不同的目录,env可以在系统的PATH目录中查找。同时,env还规定一些系统环境量。 而如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题。
Advantage & Disadvantage
在某些情况下,第一个可能是首选(如运行python脚本与多个版本的python,而不必重做可执行);但是在以安全性为重点的情况下,后者将是首选,因为它限制了代码注入的可能性。
这跟linux系统里安装python的目录有关。#!/usr/bin/python相当于写死了python路径;#!/usr/bin/env python会去环境设置寻找python目录,推荐这种写法。
“ #!/usr/bin/env bash” 的好处是可以查找当前环境中程序的默认版本。这样,您不必在系统上的特定位置查找它,因为这些路径可能位于不同系统上的不同位置,只要它在你的路径上,你就会找到它。
一个缺点是如果你想支持Linux,你将无法传递多个参数(例如你将无法编写/usr/bin/env awk -f),如POSIX is vague关于如何解释这一行,并且Linux在第一个空格之后解释所有内容以表示单个参数。您可以在某些版本的env上使用/usr/bin/env -S来解决这个问题,但随后脚本将变得更不便携,并且在相当近期的系统上中断(例如,如果不是更晚的话,甚至是Ubuntu 16.04)。
另一个缺点是,由于您没有调用显式可执行文件,因此可能存在错误,并且存在多用户系统安全问题(例如,如果有人设法在您的路径中获取名为bash的可执行文件)。
Operation
env -- It will print all your environment variables.
env python -- 发现可以进到python的shell里面。因此,脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它。
env bash / echo $BASH -- It will print your bash path (according to the environment variable list) that you should use to build your correct shebang path in your script.
Reference
Why is #!/usr/bin/env bash superior to #!/bin/bash?
————————————————
版权声明:本文为CSDN博主「vinci587」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/playboy2021/article/details/107798708