我有一个名为cmdtst_multi.ksh的脚本,当我像这样运行它时:
. ./cmdtst_multi.ksh
我有一个像这样填充的变量;
treeLvls=$(td_query {})
echo "num of tree lvls:" $treeLvls
##gives back num of tree lvls: 4
treeLvlsSQL=$(for i in {1..$treeLvls}
do
echo ",NULL as LVL$i"
done)
echo "tree sql:" $treeLvlsSQl
#gives back tree sql: ,NULL as LVL1 ,NULL as LVL2 ,NULL as LVL3 ,NULL as LVL4
运行良好
但是当我像这样运行时:
nohup cmdtst_multi.ksh > prcsstst.log &
treeLvlsSQl在日志文件中出现如下,这是不正确的:
tree sql: ,NULL as LVL{1.. ,NULL as LVL4}
为什么变量似乎运行不同?
答案 0 :(得分:2)
我的猜测是,这种差异与脚本开头看似无害的采购运营商(.
)或当前目录运营商(./
)有关。
nohup
- 没有挂机让进程不挂机时
用户注销> prcsstst.log &
- 重定向到日志文件和背景
过程将其排除在输出差异的竞争者之外。
请尝试使用下面的采购运营商nohup:
nohup ksh93 -c ". ./cmdtst_multi.ksh" > prcsstst.log
.
和./
很重要.
意味着获取当前shell,这会阻止使用新的环境变量集生成单独的子shell,而./
意味着.
中的脚本执行{1}}(当前目录)而不是$PATH
中定义的具有相同名称的其他脚本。
编辑:正如Jonathan Leffler在评论中指出的那样,这也可能是因为KSH
nohup
未被KSH
使用(FOR
可能不是默认shell?)为什么KSH的.
语法最初是从当前shell(KSH
?)获取源({{1}})时起作用的,而不是第二次(某些其他类型的shell)。