【问题标题】:MQ ksh shell script - trap errorMQ ksh shell 脚本 - 陷阱错误
【发布时间】:2018-08-17 23:47:13
【问题描述】:

我有如下的 ksh 脚本。

if [ `uname` == "AIX" ]; then
    export LIBPATH_BKP_$$=$LIBPATH
    # Trap so that it will return the original library path when script exits
    trap 1 2 3 9 15 "export LIBPATH=$LIBPATH_BKP_$$; unset LIBPATH_BKP_$$"
    export LIBPATH=/usr/mqm/lib:$LIBPATH
else # All else will be either Linux or Solaris which uses LD_LIBRARY_PATH
    export LD_LIBRARY_PATH_BKP_$$=$LD_LIBRARY_PATH
    # Trap so that it will return the original library path when script exits
    trap 1 2 3 9 15 "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH_BKP_$$; unset LD_LIBRARY_PATH_BKP_$$"
    export LD_LIBRARY_PATH=/usr/mqm/lib:$LD_LIBRARY_PATH_BKP_$$
fi

当我执行它时它说

tdestop.ksh[52]:陷阱:导出 LD_LIBRARY_PATH=49648;未设置 LD_LIBRARY_PATH_BKP_49648:错误陷阱

tdestop.ksh- 是脚本名称及其在第 52 行的错误提示。

问题是什么是坏陷阱?这里出了什么问题?我不是这方面的专家。对不起,如果这个问题真的很新手。

谢谢, 德维加

【问题讨论】:

  • 所以这只发生在 Linux(非 AIX)环境中?祝你好运。
  • 您在shellcheck.net 上查看了吗?确保在脚本顶部包含 #!/bin/ksh(93?)。并且您是否确认此错误仅发生在您发布的小代码示例中?祝你好运。
  • 您不必担心重置环境变量,因为它们是您脚本的本地变量。
  • 感谢@shellter 的洞察力。该脚本由另一个团队拥有,并且脚本很长。我只粘贴了错误提示部分。我无权访问任何 AIX 环境,因此如果它也发生在 AIX 中,我也无法遵守。感谢您的评论。
  • @LorinczyZsigmond - 这个脚本归另一个团队所有。我无权改变它的设计方式。感谢您的输入。当我编写自己的脚本时,我应该考虑到这一点。感谢您的回复。

标签: linux shell ksh


【解决方案1】:

语法是:

trap action signals...

例如

trap 'echo "I caught something"' HUP INT TERM

你改变了动作和信号的顺序,这就是ksh 抱怨的原因。您应该改为使用:

trap "export LIBPATH=$LIBPATH_BKP_$$; unset LIBPATH_BKP_$$" 1 2 3 9 15 

【讨论】:

  • 我已经在导出操作后移动了信号。现在如何确保陷阱正常工作?如何为导出操作创建一些失败?我很想能够测试它。感谢一百万您的提示!
  • cmets 表示其目的是在脚本完成后重置已修改的变量。由于所有变量都是针对每个进程的,因此这没有任何意义:无论如何,任何更改都会随着脚本而消失。
  • 所以我会说代码效率不高或不需要。我已经改变了它。到目前为止,一切都很好。没有错误,正如您提到的,此语句对脚本没有逻辑贡献。
猜你喜欢
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 2019-10-18
相关资源
最近更新 更多