Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在尝试将shell脚本的输出重定向到文件和标准输出。脚本中的cd命令会导致奇怪的行为_Java_File_Shell_Cd - Fatal编程技术网

Java 正在尝试将shell脚本的输出重定向到文件和标准输出。脚本中的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

情况如下:

我有一个shell脚本-script.ksh

我从java程序调用它,我需要java程序中脚本的stdout

我还需要将输出重定向到一个文件,如果脚本在任何时候失败,我必须发送一封带有附加文件的邮件

因此,必须在脚本退出之前关闭该文件,以便邮件发送程序可以发送它

我把一切都做好了

除了一件事-如果脚本中有任何“cd”语句,则在脚本结束之前文件不会关闭。请帮帮我

不知道为什么会这样

下面是代码的简化版本

#!/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,只需直接执行这些命令即可。