0

我有一个从 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
4

1 回答 1

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在顶部使用 a,或者您需要将其显式调用为csh -f script-name.

你错过了几个反斜杠。由于该行没有\-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/对此进行了讨论,但该网站目前似乎已关闭;谷歌缓存在这里

因此,这是您的问题中脚本的相关部分:

/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.

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

于 2012-08-06T20:59:36.730 回答