2014-11-21 26 views
0

不同的运行我有一个脚本调用cmdtst_multi.ksh,当我运行它是这样的:KSH脚本变量中的nohup

. ./cmdtst_multi.ksh 

我有一个被填充这样的varible;

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} 

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

+2

难道问题是'nohup'不能用'ksh'运行脚本,但用其他的东西? – 2014-11-21 19:47:09

+0

用'#!/ bin/ksh'开始你的脚本,看看乔纳森是否正确。 您的ksh是否支持'1..5}'结构中的'我! – 2014-11-28 09:27:33

回答

2

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

  1. nohup - 没有挂断,使这一进程不挂断,当 用户登录超时
  2. > prcsstst.log & - 重定向到日志文件和背景的 过程

这就排除了他们的竞争者为输出的差异。

请尝试用外包运营商的nohup象下面这样:

nohup ksh93 -c ". ./cmdtst_multi.ksh" > prcsstst.log 

../是重要.意味着采购这样可防止产卵用一套新的环境变量和./一个独立的子shell当前shell意味着脚本在.(当前目录)中执行,而不是在$PATH中定义的具有相同名称的其他脚本。

编辑:正如乔纳森·莱弗勒在他的评论中指出,这也可能是因为KSH没有使用nohupKSH不是默认的shell吧?),这或许可以解释为什么KSH的FOR语法采购时开始工作(. )从当前shell(KSH?),但不是第二次(某些其他类型的shell)。

+0

所以当我像这样运行时......我得到一个错误,说nohup不能运行“。”命令......我在我的文件上做了chmod 755,应该够了吗? – user2061886 2014-12-06 00:39:36

+0

对不起。看起来'nohup'预计第一个参数是一个文件名。另外,nohup和'.'不会在一起,因为nohup会生成一个新的shell。我编辑了未经测试的命令,因为我没有与我在一起的shell。编辑后的命令,如果有效的话,仍然会产生一个新的外壳,这将破坏外包的目的。至少你可以确定它是由'Ksh'执行的,而不是其他shell。 – toddlermenot 2014-12-06 03:59:58