Java 正在尝试将shell脚本的输出重定向到文件和标准输出。脚本中的cd命令会导致奇怪的行为
情况如下: 我有一个shell脚本-script.ksh 我从java程序调用它,我需要java程序中脚本的stdout 我还需要将输出重定向到一个文件,如果脚本在任何时候失败,我必须发送一封带有附加文件的邮件 因此,必须在脚本退出之前关闭该文件,以便邮件发送程序可以发送它 我把一切都做好了 除了一件事-如果脚本中有任何“cd”语句,则在脚本结束之前文件不会关闭。请帮帮我 不知道为什么会这样 下面是代码的简化版本Java 正在尝试将shell脚本的输出重定向到文件和标准输出。脚本中的cd命令会导致奇怪的行为,java,file,shell,cd,Java,File,Shell,Cd,情况如下: 我有一个shell脚本-script.ksh 我从java程序调用它,我需要java程序中脚本的stdout 我还需要将输出重定向到一个文件,如果脚本在任何时候失败,我必须发送一封带有附加文件的邮件 因此,必须在脚本退出之前关闭该文件,以便邮件发送程序可以发送它 我把一切都做好了 除了一件事-如果脚本中有任何“cd”语句,则在脚本结束之前文件不会关闭。请帮帮我 不知道为什么会这样 下面是代码的简化版本 #!/bin/ksh #Need to redirect output to fi
#!/bin/ksh
#Need to redirect output to file and stdout
exec 6>&1 #save stdout in [6]
exec 1>shell.log 2>&1 #redirect stderr and stdout to file
#if any error happens reset stdout and print the log contents
trap '
echo "Error Trap";
exec 1>&- 1>&6 6>&-;
echo | cat shell.log>&1;
echo "send the log file by mail";
exit 1' ERR
#cd / #Uncomment and the script behaves differently
echo "some task"
./somescript.ksh #this requires me to cd to its directory and then execute
trap - ERR #End the ERR trap
#in case of normal exit print the log contents
trap '
echo "Normal Exit"
exec 1>&- 1>&6 6>&-;
echo | cat shell.log>&1;
exit 1' EXIT
您正在打开当前目录中的文件,然后更改目录。尝试为这些文件使用绝对路径 为什么要通过
cat
传送echo
?它在脚本中没有效果。只需cat
文件即可。也没有必要将stdout重定向到stdout<代码>cat文件与cat文件>&1
相同
您为什么要执行
exit 1
以正常退出。我应该退出0
从java执行内置命令时出现问题。。。可能您的问题就在于此……当我从提示符或java执行时,不会得到任何不同的结果。如果我评论cd命令,行为会发生变化感谢您指出退出和echo cat错误。使用绝对路径确实有效。但是我不能真正使用绝对路径,因为我正在从我的脚本调用另一个脚本,而另一个脚本使用相对路径。我不能改变另一个脚本。如果有任何简单的解决方法,那么请告诉我,否则我在java端有一个解决方法。但是如果我能让cd按照我想要的方式工作,它会帮我节省很多工作。。。这个问题是由cd创建的子shell引起的吗?这就是谷歌搜索结果所指向的。@Sougata:我想你不能更改另一个脚本。如果是这种情况,则需要指定到shell.log
的完整绝对路径<代码>cd不会创建任何子shell。您所处的目录与开始时的目录不同,您正试图关闭一个不在新目录中的文件。尝试使用pushd
而不是cd
,然后就可以在关闭陷阱中的文件之前和结束时执行popd
。此外,在退出之前不必设置EXIT
trap,只需直接执行这些命令即可。