从Java GUI运行的csh脚本崩溃并冻结终端

时间:2012-08-06 19:25:24

标签: csh xterm

我有一个从Java GUI运行的脚本。它执行SQL脚本并将结果写入tmp目录中的日志文件。脚本的其余部分应该打开一个xterm并将输出文件的结果显示在屏幕上。它创建了所谓的日志文件,它也打开了一个xterm。唯一的问题是它在那之后冻结了,我必须重新开始整个过程​​。以下是我用来打开xterm

的脚本示例
#!/bin/csh -f



#set MYSQL=${MYSQL_HOME}/mysql
set PSQL=${PSQL_HOME}/psql
set MORE=/usr/xpg4/bin/more


set REPORT=/h/Scripts/DataValidation/ParametersDataReport.sql


#${REPORT}

${PSQL} ${USER}<${REPORT} 

#Get the number of lines in the report file for scrollbar control
#set lc='wc -l /tmp/results.log'
#echo $lc

#Open an extra terminal

set title="EARTH ORIENTATION PARAMETERS REPORT"

/usr/openwin/bin/xterm -T "$title" \
-bg lightblue -fg black -sb -sl 2000 -ut -e ${MORE}  \
-f /h/USERS/Pablito/results.log     \

exit

MOREtitle被定义为脚本文件中的变量。为什么我的脚本崩溃并导致终端挂断?这可能是一个分段错误吗?

我通过ssh连接完成所有这些工作。我查看了发出的命令,这就是它所说的:

/usr/openwin/bin/xterm -sb -ls -display@d&@;

我在终端上输入了这个命令,它很好地显示了结果。为什么我不能从GUI执行此操作?

/usr/openwin/bin/xterm -T EARTHORIENTATIONPARAMETER -geometry 104x50+0+80 -bg lightblue -fg black -sb -sl 2000 -ut -e /usr/xpg4/bin/more -f /tmp/results.log

当我尝试使用GUI时,它就冻结了我(意味着我无法访问GUI或终端)。它还包含错误

bg: Command not found

在启动GUI的终端上。

我想我真正应该问的是如何在csh脚本中执行以下命令,因为当我从终端手动输入它时会产生所需的效果

xterm -T "EarthOrientation Parameter" -geom 104x50+0+80 -bg pink -fg black -sb -sl   2000 -ut -e /usr/xpg4/bin/more -f /h/USERS/local/Pablito/results.log

1 个答案:

答案 0 :(得分:1)

我会假设您问题中的脚本版本与您实际运行的版本匹配。

/usr/openwin/bin/xterm \
-title "$title"        \ 
-geometry 100x40+0+90
-bg lightblue -fg brown \
-sb -sl 2000 -ut
-e ${MORE} -F /tmp/results.log

如果您要将其作为csh脚本调用,则顶部需要#!/bin/csh -f需要以csh -f script-name显式调用它。< / p>

你错过了几个反斜杠。由于\行上没有-geometry,因此后面的行不作为参数传递给xterm命令。您向我们展示的代码等同于:

/usr/openwin/bin/xterm -title "$title" -geometry 100x40+0+90
-geometry 100x40+0+90 -bg lightblue -fg brown sb -sl 2000 -ut 
-e ${MORE} -F /tmp/results.log

这应该在没有指定命令的情况下调用xterm,因此它将以交互方式运行您的默认shell。以下行应产生错误消息:

-geometry: Command not found.
-e: Command not found.

但是如果你从GUI调用脚本,你很可能看不到这些消息。

\geometry行的末尾添加-sb字符可以解决该问题。

由于脚本在前台调用xterm(命令中没有尾随&),脚本将等待xterm窗口关闭,然后再终止。

你说它“冻结”;我不确定你是什么意思,但是在xterm关闭并且脚本终止之后发生的任何事情都将由您未向我们展示的Java GUI代码控制。

同样,我假设你实际运行的脚本中缺少那些反斜杠。如果没有,您需要更新您的问题,向我们展示您正在运行的完全脚本。

更新:

显然我的假设不正确;您的实际脚本与最初出现在您问题中的脚本完全不同。

我无法强调强调复制并粘贴导致问题的精确脚本或程序的重要性,或者您已确认导致该问题的修改版本的重要性问题。如果您尝试发布脚本的近似,则很可能会忽略导致问题的代码。

http://sscce.org/对此进行了讨论,但该网站目前似乎已失效; Google缓存为here

所以这是现在问题中脚本的相关部分:

/usr/openwin/bin/xterm -T "$title" \
-bg lightblue -fg black -sb -sl 2000 -ut -e ${MORE}  \
-f /h/USERS/Pablito/results.log     \

exit

在评论中,您说过您收到类似

的错误
-bg Command is not found

这应该是问题所在,因为对于任何想要回答问题的人来说,这都是至关重要的信息。

(我怀疑它确实是-bg: Command not found.;再次,精确的复制和粘贴对于错误消息和代码一样重要。)

我认为现在的问题是你在xterm行反斜杠之后有一个空格。 \行继续符必须位于一行的最后。如果反斜杠后面有空格,则不将其视为延续字符,下一行将被视为单独的命令。

你命令最后一行的\没用,而且有潜在危险。它将该行与以下行连接,该行为空,因此可能无害,但如果删除该空行,则会将单词exit作为参数传递给xterm

最简单的解决方法是修改脚本,使整个命令位于一条(非常长)的行上,没有反斜杠。