首页 文章

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

提问于
浏览 165
1

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

  • 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

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

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

相关问题