如果重定向 STDOUT 时出现错误,是否可以不覆盖文件?

如果重定向 STDOUT 时出现错误,是否可以不覆盖文件?

我有一个简单的语法错误的命令,就像这样,它应该在 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 .. : labelwindows端的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在行或文件名的末尾附加虚假内容。

相关内容