linux 从'ksh'脚本调用'ksh'将停止执行

z9zf31ra  于 2023-02-11  发布在  Linux
关注(0)|答案(1)|浏览(153)

我正在从另一个ksh脚本执行ksh脚本。被调用的脚本以执行ksh结束,这只是停止调用者脚本继续。
MRE

#!/bin/ksh
# Caller Script

. ~/called
# Does not continue to next echo.
echo "DONE!"
#!/bin/ksh
#Called script

# Some exports..

ENV=calledcalled ksh

set -x输出

++ ksh
++ ENV=calledcalled
.kshrc executed

如果我直接在我的调用程序中运行calledcalled,它工作正常(即继续执行下一个命令。为什么会发生这种情况?我检查了$?,它是0。我尝试了./called || true。如果需要更多信息,请告诉我。
注意:调用的脚本不在我的控制范围内。

ffscu2ro

ffscu2ro1#

这是完全正常的,也是意料之中的。记住,当你运行cmd1; cmd2时,cmd2不会运行 * 直到cmd1退出 *。
当您的脚本运行ksh时(并且从终端或其他上下文调用,在这些上下文中阅读stdin不会立即导致EOF),没有任何东西会创建ksh exit的新副本--它等待stdin上正常提供要运行的代码--因此脚本只是坐在那里等待ksh的副本退出,然后再执行其他操作。
有很多方法可以解决这个问题,下面是几个简单的方法:

  • 确保stdin为空,以便子解释器不能等待输入
. ~/called </dev/null
  • 定义一个名为ksh的 function,它什么也不做。
ksh() { echo "Not actually running ksh" >&2; }
. ~/called
  • ENV(一个变量,定义后,它会告诉任何shell在执行其他操作之前先运行该文件中的代码)设置为脚本的文件名,该脚本在运行时会导致任何交互式shell立即退出。
exit_script=$(mktemp -t exit_script.XXXXXX)
printf '%s\n' 'case $- in *i*) exit 0;; esac' >"$exit_script"
ENV=$exit_script . ~/called
rm -f -- "$exit_script"

以上只是几种方法;你当然可以想象更多的只是一个小的思考和实验。

相关问题