测试 bash 中的选项效果不佳

测试 bash 中的选项效果不佳

我试图使用以下命令测试 noclobber 选项:if [ -o noclobber ]但它什么也没做。

我将 noclobber 选项设置为使用:set +o noclobber

prompt> cat checkoption.sh
#!/bin/bash
if [ -o noclobber ]
     then
          echo "Option is on."
fi
prompt>
prompt> set +o noclobber
prompt> set -o | grep noglobber
noclobber       on
prompt> ./checkoption.sh
prompt>

知道为什么我在这里收不到消息吗?

答案1

Shell 选项不会在 shell 会话之间继承,并且您在这里处理两个 shell 会话:

  1. 您在其中设置 shell 选项的交互式会话,以及
  2. 您在其中测试选项的 shell 脚本会话。

shell 脚本永远不会检测到在调用交互式 shell 会话中设置了该选项。

解决方案:

  1. 将您的代码转换为 shell 函数(例如$HOME/.bashrc):

    checknoclobber () { [ -o noclobber ] && echo 'Noclobber is on'; }
    

    或者,对于一般情况,

    checkoption () {
        if [ -o "$1" ]; then
            printf '%s is set\n' "$1" >&2
            return 0
        else
            printf '%s is not set (or invalid option name)\n' "$1" >&2
            return 1
        fi
    }
    
  2. 在脚本中设置选项。

  3. source使用或命令在交互式 shell 中获取脚本文件.

相关内容