我从this link阅读了这个问题的答案 在Stackoverflow.com中。但我在编写shell脚本方面是如此新颖,以至于我做错了什么。以下是我的脚本:
testscript:
#!/bin/csh -f
pid=$(ps -opid= -C csh testscript1)
while [ -d /proc/$pid ] ; do
sleep 1
done && csh testscript2
exit
testscript1:
#!/bin/csh -f
/usr/bin/firefox
exit
testscript2:
#!/bin/csh -f
echo Done
exit
目的是让testscript首先调用testscript1;一旦testscript1已经完成(这意味着在script1中调用的firefox被关闭),testscript将调用testscript2。但是在运行testscript之后我得到了这个结果:
$ csh testscript
Illegal variable name.
请帮我解决这个问题。谢谢。
答案 0 :(得分:2)
我相信这条线不是CSH:
pid=$(ps -opid= -C csh testscript1)
通常在csh中定义如下变量:
set pid=...
我不确定$()语法是什么,也许回到标记woudl作为替代:
set pid=`ps -opid= -C csh testscript1`
答案 1 :(得分:1)
也许您没有注意到您找到的脚本是为bash编写的,而不是csh,但是 你正试图用csh解释器来处理它们。
看起来你误解了原始代码试图做的事情 - 事实确实如此 旨在通过使用进程名称查找其进程ID来监视已存在的进程。
您似乎正在尝试从ps
命令内部启动第一个进程。但
在这种情况下,你不需要做任何如此复杂的事情 - 你需要的一切
是:
#!/bin/csh
csh testscript1
csh testscript2
除非您不遗余力地在后台运行其中一个脚本, 在第一个脚本完成之前,第二个脚本不会运行。
虽然这与你的问题无关,但csh更倾向于 互动使用;对于脚本编写,it's considered a poor choice,所以你可能会 最好还是学习bash。
答案 2 :(得分:0)
尝试,
下面的脚本将检查testscript1的pid,如果找不到则会执行testscirpt2
sp=$(ps -ef | grep testscript1 | grep -v grep | awk '{print $2}')
/bin/ls -l /proc/ | grep $sp > /dev/null 2>&1 && sleep 0 || /bin/csh testscript2