例如:
$ cat foo.sh
#!/usr/bin/env bash
while true; do sleep 1 ; done
$ ./foo.sh &
$ pgrep foo.sh
$
Run Code Online (Sandbox Code Playgroud)
对比:
$ cat bar.sh
#!/bin/bash
while true; do sleep 1 ; done
$ ./bar.sh &
$ pgrep bar.sh
21202
Run Code Online (Sandbox Code Playgroud)
由以下命令启动的进程env bash显示在输出中ps aux:
terdon 4203 0.0 0.0 26676 6340 pts/3 S 17:23 0:00 /bin/bash
Run Code Online (Sandbox Code Playgroud)
而开头的/bin/bash显示为
terdon 9374 0.0 0.0 12828 1392 pts/3 S 17:27 0:00 /bin/bash ./bar.sh
Run Code Online (Sandbox Code Playgroud)
这可能解释了为什么它第一个没有被 捕获pgrep。所以,问题是:
env?我试图在 的帮助下在 Python 进程中提取环境变量env --null,它甚至适用于包含换行符的环境变量。
但是在某些机器上我收到了一个错误:
> env -0
env: invalid option -- '0'
> env --null
env: unrecognized option '--null'
> env --version
env (GNU coreutils) 6.12
Copyright (C) 2008 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)
论证是在哪个版本中引入的?是否有任何替代命令来提取环境?
我想知道如何bashrc在新贵脚本中加载变量并运行(node.js在这种情况下是服务器)。
最好的方法是什么?
我试过这个:
exec sudo -u someuser $NODE_PATH $FULL_PATH/$FILE_NAME >> /var/log/$PROGRAM_NAME.sys.log 2>&1
Run Code Online (Sandbox Code Playgroud)
和这个
exec start-stop-daemon --start -c someuser --exec $NODE_PATH $FULL_PATH/$FILE_NAME >> /var/log/$PROGRAM_NAME.sys.log 2>&1
Run Code Online (Sandbox Code Playgroud)
但是在第一个选项中,节点应用程序无法读取http_proxy变量(在 中定义/etc/bash.bashrc)。在第二个中它无法读取配置文件(节点应用程序安装在/opt文件夹中)
我收到错误
/usr/bin/env: zsh -: No such file or directory
Run Code Online (Sandbox Code Playgroud)
...当我运行以zsh以下shebang行开头的可执行脚本时:
#!/usr/bin/env zsh -
Run Code Online (Sandbox Code Playgroud)
此外,FWIW,替换-为--原因/usr/bin/env打印关于zsh --.
我只在 ubuntu 下看到过这个错误,而且只在 shebang hack 的上下文中看到过。在达尔文下,相同的脚本运行良好。在 ubuntu 下,运行
% /usr/bin/env zsh -
Run Code Online (Sandbox Code Playgroud)
从命令行成功。(实际上,“在 ubuntu 下”应该理解为“在 ubuntu 12.04 LTS 和env (GNU coreutils) 8.13”下的简写。)
我的问题是:如何修改上面的shebang以避免此错误?
当然,我知道删除尾随-会消除错误,但这不是一个可以接受的解决方案。这篇文章的其余部分解释了原因。
导致错误的 shebang 行是为了遵守两个完全独立的准则:
要使脚本可移植,请使用#!/usr/bin/env <cmd ...>而不是#!/path/to/cmd <...>.
把-作为唯一参数zsh在zsh的脚本横座板某类的家当线的攻击。
所以,我可以更准确地重申我的问题如下:是否有可能同时满足这两个准则而不会在 ubuntu 下触发上面显示的错误?