kh脚本变量在nohup中的运行方式不同

时间:2014-11-21 17:54:01

标签: unix ksh

我有一个名为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}

为什么变量似乎运行不同?

1 个答案:

答案 0 :(得分:2)

我的猜测是,这种差异与脚本开头看似无害的采购运营商(.)或当前目录运营商(./)有关。

  1. nohup - 没有挂机让进程不挂机时 用户注销
  2. > prcsstst.log & - 重定向到日志文件和背景 过程
  3. 将其排除在输出差异的竞争者之外。

    请尝试使用下面的采购运营商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)。