问题在/ usr/bin中/ env的问题:关于家当线pecularities
- 是什么内核做,如果你坚持一个shell脚本到家当线?
- Kernel如何知道启动哪个解释器?
说明:
我最近想写一个包装围绕在/ usr/bin中/ env的因为我的CGI环境不允许我设置全局PATH变量,但(这当然很烂!)。
所以我想, “OK,让我们设置PREPENDPATH并设置PATH围绕ENV的包装。”得到的脚本(这里称为env.1)是这样的:
#!/bin/bash
/usr/bin/env PATH=$PREPENDPATH:$PATH $*
它看起来像它应该工作。我查了一下他们俩的反应如何,设置PREPENDPATH后:
$ which /usr/bin/env python
/usr/bin/env
/usr/bin/python
$ which /usr/bin/env.1 python
/usr/bin/env
/home/pi/prepend/bin/python
看起来绝对完美!到现在为止还挺好。但看看“Hello World!”会发生什么?
# Shebang is #!/usr/bin/env python
$ test-env.py
Hello World!
# Shebang is #!/usr/bin/env.1 python
$ test-env.1.py
Warning: unknown mime-type for "Hello World!" -- using "application/*"
Error: no such file "Hello World!"
我想我失去了一些东西有关UNIX非常基本的。
即使在查看原始env的源代码后,我仍然迷失了方向。它设置了环境并启动了程序(或者对我而言似乎......)。
这是有用的信息,但是作为OP说,他/她的内核将无法运行非二进制文件(比如你提供的bash存根)作为shebang行的第一个元素。我的也不会;具体来说,内核默默无法运行脚本,并在所需的(非二进制)解释器中运行有问题的shebang行,然后我的shell会尝试运行脚本。 (我的理解是,这是一个很多shell保留的旧时shell行为。) – dubiousjim 2012-04-23 17:41:35