【问题标题】:Open file descriptor in Bash in overwrite mode以覆盖模式在 Bash 中打开文件描述符
【发布时间】:2018-11-25 01:11:54
【问题描述】:

我正在使用

在我的 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&lt;&gt; file 语句是否有一个选项可以在打开文件时截断文件?


替代解决方案:

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

【问题讨论】:

    标签: bash file-io truncate


    【解决方案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}"
    

    你将实现两件事:

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

    【讨论】:

      【解决方案2】:
      exec 3>$Reproducer
      

      除非您需要阅读文件,否则应该可以使用。在这种情况下:

      exec 3>$Reproducer 4<$Reproducer
      

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

      【讨论】:

      • 文件描述符被使用只写
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多