我有一个从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
MORE
和title
被定义为脚本文件中的变量。为什么我的脚本崩溃并导致终端挂断?这可能是一个分段错误吗?
我通过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
答案 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
。
最简单的解决方法是修改脚本,使整个命令位于一条(非常长)的行上,没有反斜杠。