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的可执行文件)。
  • “ #!/usr/bin/env bash” is definitely better because it finds the bash executable path from your system environment variable.
  • ” #!/usr/bin/bash”  searches PATH for bash, and bash is not always in /bin, particularly on non-Linux systems. For example, on my OpenBSD system, it's in /usr/local/bin, since it was installed as an optional package.
  • If you are absolutely sure bash is in /bin and will always be, there's no harm in putting it directly in your shebang—but I'd recommend against it because scripts and programs all have lives beyond what we initially believe they will have.

 

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?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vinci587

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值