我正在用打开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中读取。