以覆盖模式在Bash中打开文件描述符



我正在用打开Bash脚本中的其他文件描述符

Reproducer="reproducer.sh"
exec 3<> $Reproducer

这可以与例如echo一起使用

echo "#! /bin/bash" >&3
echo "echo This is a reproducer script." >&3

来源:文件描述符是如何工作的?

正如我在多次尝试后注意到的那样,打开的文件会覆盖文件中现有的内容。如果新内容较大,它将展开文件,但如果新内容的字节较少,则旧内容将保留在文件末尾。

在我的情况下,这会创建一个损坏的脚本,因为我正在编写Bash脚本。

exec 3<> file语句是否有在打开时截断文件的选项?


替代解决方案:

  • 在使用rm $Reproducer打开之前删除该文件

您可以做的一件事是创建一个临时文件并用这个文件替换旧文件。

exec 3<>/tmp/script
printf "%sn" "#!/bin/bash" >&3
printf "%sn" "printf "This is a reproducer script.n"" >&3
exec 3>&-
mv /tmp/script "${Reproducer}"

你将实现两件事:

  • 你的新脚本最后不会留下任何垃圾
  • 如果该过程在完成之前失败,您将不会删除以前的脚本,并且仍然可以恢复部分创建的文件
exec 3>$Reproducer

应该工作,除非你需要阅读文件。在这种情况下:

exec 3>$Reproducer 4<$Reproducer

然后从文件描述符4中读取。

最新更新