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

时间:2018-11-25 01:11:54

标签: bash file-io truncate

我正在使用以下命令在Bash脚本中打开其他文件描述符:

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

然后可以与例如echo

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

来源: How do file descriptors work?

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

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

exec 3<> file语句是否可以选择在打开时截断文件?


替代解决方案:

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

2 个答案:

答案 0 :(得分:1)

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

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

您将实现两件事:

  • 您的新脚本结尾将不会有任何垃圾;
  • 如果该过程在完成前失败,则您将不会删除以前的脚本,并且仍然可以恢复部分创建的文件。

答案 1 :(得分:0)

.as-console-wrapper { max-height: 100% !important; top: 0; }

应该可以工作,除非您需要读取文件。在这种情况下:

exec 3>$Reproducer

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