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

时间:2011-04-07 13:26:31

标签: shell sh

如何确保在运行脚本时没有从父级继承的意外函数?如果使用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 \  )

2 个答案:

答案 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