File 从中读取内容的文件的标准输出

File 从中读取内容的文件的标准输出,file,bash,io,redirect,io-redirection,File,Bash,Io,Redirect,Io Redirection,当我想使用Bash修改文件时,我通常会将stdout重定向到另一个文件,然后删除原始文件。有没有更快的办法 例如: cut -d':' -f2 FILE > FILE 这将使我的源文件为空(在写入之前清空文件,然后开始读取) 我所能做的就是: cut -d':' -f2 FILE > FILE2 rm -f FILE mv FILE2 FILE 有没有一种方法可以在一步之内将(修改过的)输出重定向到原始文件?恐怕我在bash中没有答案,但在zsh中非常简单: cut -d':'

当我想使用Bash修改文件时,我通常会将stdout重定向到另一个文件,然后删除原始文件。有没有更快的办法

例如:

cut -d':' -f2 FILE > FILE
这将使我的源文件为空(在写入之前清空文件,然后开始读取)

我所能做的就是:

cut -d':' -f2 FILE > FILE2
rm -f FILE
mv FILE2 FILE

有没有一种方法可以在一步之内将(修改过的)输出重定向到原始文件?

恐怕我在bash中没有答案,但在zsh中非常简单:

cut -d':' -f2 =(cat FILE) > FILE

=(…)
构造创建了一个包含所述程序输出的临时文件,该文件在包含该文件的命令完成后被删除。

恐怕在bash中没有方便的通用方法。问题是,在运行任何命令之前,bash会打开
文件
进行输出,并将其截断,因此当
cat
打开文件时,它看到的只是新的空文件
sed
有一个
-i
选项来进行内联替换(它实际上使用了一个临时文件),而
zsh
=(…)
,如其他答案中所述,并且
排序
手动检查输入和输出文件是否匹配(当使用
-o
时,正如我提到的,使用shell重定向将在程序看到文件之前擦除该文件),但是
cut
和许多其他实用程序不这样做。你必须使用一个临时文件来处理这些文件。

如果你安装了(科林博客上的链接似乎已经死了,但你可以将其作为一部分获得),你可以使用它来“吸收”将输出转储回文件之前,请执行以下操作:

cat FILE | cut -d':' -f2 | sponge FILE

无论如何,谢谢你。不过,有没有办法用“shopt”这样的词来做到这一点呢?谢谢,我很快就会尝试,可能正是我想要的。做
cat.zsh_history |海绵>.zsh_history
会擦除所有内容。
scape
应该在没有指定文件的情况下支持stdout,但在这种情况下似乎出现了故障。有什么想法吗?@tony问题是您使用了
scape>.zsh_历史记录
而不是
海绵.zsh_历史记录
意味着shell将重定向到输出文件,并且shell总是在启动命令之前删除文件的内容(
海绵
)。如果您将文件名作为参数传递给
海绵
,它将等待从输入管道读取所有内容,然后删除旧内容并写出新内容。感谢您在此处解释shell的责任。我可以看到海绵的标准输出支持在较长管道中的作用。