我正在从另一个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
。如果需要更多信息,请告诉我。
注意:调用的脚本不在我的控制范围内。
1条答案
按热度按时间ffscu2ro1#
这是完全正常的,也是意料之中的。记住,当你运行
cmd1; cmd2
时,cmd2
不会运行 * 直到cmd1
退出 *。当您的脚本运行
ksh
时(并且从终端或其他上下文调用,在这些上下文中阅读stdin不会立即导致EOF),没有任何东西会创建ksh exit的新副本--它等待stdin上正常提供要运行的代码--因此脚本只是坐在那里等待ksh
的副本退出,然后再执行其他操作。有很多方法可以解决这个问题,下面是几个简单的方法:
ENV
(一个变量,定义后,它会告诉任何shell在执行其他操作之前先运行该文件中的代码)设置为脚本的文件名,该脚本在运行时会导致任何交互式shell立即退出。以上只是几种方法;你当然可以想象更多的只是一个小的思考和实验。