自行覆盖文件的最佳方法

fwe*_*eth 6 linux bash shell

读取文件然后将内容写入同一文件的最快/最优雅的方法是什么?

在Linux上,这并不总是与“触摸”文件相同,例如,如果文件代表某个硬件设备。

对我echo $(cat $file) > $file有用的一种可能性是,但我想知道这是否是最佳实践。

Grz*_*orz 7

我明白你对简单的事情不感兴趣touch $file感兴趣,而是对文件的转换形式感兴趣。

由于文件的转换可能会导致其暂时损坏,因此在其他人可能同时读取它的同时将其放置到位并不好。

因为该临时文件是您的最佳选择,并且只有在转换文件时才应该一步替换该文件:

cat "$file" | process >"$file.$$"
mv "$file.$$" "$file"
Run Code Online (Sandbox Code Playgroud)

这是最安全的一组操作。

当然我省略了“检查文件是否真的存在”之类的操作,留给你吧。


Joh*_*ica 5

通常无法一步一步完成此操作,因为写入文件可能会干扰从文件中读取数据。如果您在常规文件上尝试此操作,则>重定向很可能在读取任何内容之前将文件清空。

您最安全的选择是将其分为两个步骤。如果需要,可以将其隐藏在函数调用后。

rewrite() {
    local file=$1

    local contents=$(< "$file")
    cat <<< "$contents" > "$file"
}

...

rewrite /sys/misc/whatever
Run Code Online (Sandbox Code Playgroud)


Emi*_*ien 5

moreutils 包中的海绵实用程序允许这样做

~$ cat file
foo
~$ cat file | sponge file
~$ cat file
foo
Run Code Online (Sandbox Code Playgroud)