如何删除sh(posix)中的继承函数

在运行脚本时,如何确保没有从父项继承的意外函数?如果使用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'应该提供的功能?

edit

稍微不那么难看,但没有更好(我不喜欢解析env的输出):

unset -f $( env | sed -n '/\([^=]*\)=(.*/s//\1/p' | tr \\012 \  )

回答(2)

3 years ago

#!/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

3 years ago

如何使用以下 env shebang行设置合理的 PATH 变量来调用 sh 解释器:

#!/usr/bin/env -i PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/xpg4/bin sh