如何确保在运行脚本时没有从父级继承的意外函数?如果使用bash,
#!/bin/bash -p
将完成这一操作,将通过env -i调用脚本。但是我不能依赖用户来调用env,我不想依赖bash,我不想做exec-hack并重新执行脚本,而且
#!/usr/bin/env -i sh
不起作用。
所以我正在寻找一种可移植的方式(portable == posix)来确保用户没有定义会意外地修改脚本行为的函数。我目前的解决方案是:
eval $( env | sed -n '/\([^=]*\)=(.*/s//\1/p' | while read -r name; do echo unset -f $name\;; done )
但这很丑陋,而且可靠性很高。有没有一种很好的方法来获得'unset -f -a'应该提供的功能?
修改
稍微不那么难看,但没有更好(我不喜欢解析env的输出):
unset -f $( env | sed -n '/\([^=]*\)=(.*/s//\1/p' | tr \\012 \ )
答案 0 :(得分:1)
#!/bin/bash --posix
结果:
SHELLOPTS=braceexpand:hashall:interactive-comments:posix
同样如下:
#!/bin/sh
SHELLOPTS=braceexpand:hashall:interactive-comments:posix
和“sh”是posix ......
编辑:
测试了一些功能 - 在我的情况下不需要取消设置......
EDIT2:
比较“set”的输出,而不只是“env”
EDIT3:
以下示例 - “set | wc”的输出也给出了相同的结果:
#!/bin/sh
set
set|wc
unset -f $( env | sed -n '/\([^=]*\)=(.*/s//\1/p' | tr \\012 \ )
set
set|wc
答案 1 :(得分:1)
如何使用以下env
shebang行设置合理的PATH
变量来调用sh
解释器:
#!/usr/bin/env -i PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/xpg4/bin sh