![如果重定向 STDOUT 时出现错误,是否可以不覆盖文件?](https://linux22.com/image/166332/%E5%A6%82%E6%9E%9C%E9%87%8D%E5%AE%9A%E5%90%91%20STDOUT%20%E6%97%B6%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%EF%BC%8C%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%B8%8D%E8%A6%86%E7%9B%96%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我有一个简单的语法错误的命令,就像这样,它应该在 Unix/Linux 主机上运行
$ echo "first string $PATH" > out.lst
$ ECHO second string %PATH% > out.lst
第一行将成功并填充输出文件,而第二行将失败,清空先前填充的文件。
我正在尝试找到一种方法来保留文件的内容,以防在调用某些输出旨在覆盖文件的命令时发生错误。
用例有点奇怪:我正在尝试为 Oracle SQL*Plus 编写一个可移植的 SQL 脚本,该脚本旨在从底层操作系统(可能是 Linux 或 Windows)调用命令。由于无法检测操作系统,我正在调用两个平台的命令,并尝试通过不引发异常来使事情正常工作。
在 Windows 上,两行都会成功,第二行将覆盖第一行。在 Linux 上,第二行将失败,但我想保留文件的内容。
答案1
使用>
,在实际重定向发生之前文件将始终被清空。您可以使用>>
将后续重定向附加到同一目标。
答案2
有很多技巧可以让脚本在 Windows 和 Unix 上运行,例如这关于 stackoverflow 的问题。
示例:将 a 放在:
unix 命令的开头,以便cmd.exe
跳过它,将 a#
放在其末尾,这样 unix shell 就不会因额外的回车符而阻塞:
:; echo "unix path = $PATH" > out.lst; exit #
@echo off
echo windows path = %PATH% > out.lst
如果你需要多行,你应该将unix端的here-document与goto label .. : label
windows端的a结合起来:
:; true <<EOT
@echo off
echo windows path = %PATH% > file.txt
echo windows sux
goto skip
EOT
echo "linux path = $PATH" > file.txt #
echo linux sux #
: skip
请注意, 应该<<EOT
是该行的最后一个,并且 unix 部分中的所有行都应该以 a 结尾,#
以免^M
在行或文件名的末尾附加虚假内容。