Bash 在文件开头插入文本+;stdout,stderr

Bash 在文件开头插入文本+;stdout,stderr,bash,unix,ed,Bash,Unix,Ed,我有一个函数“backup”,这个函数从控制台的输出也被重定向到一个文件,操作如下: backup > >(tee -a ./log.txt) 2>&1 它可以工作,但我想在文件的开头添加新的输出数据,就我的情况而言,似乎要明智地使用ed(而不是sed),我采用以下方式进行操作: ed -s log.txt < <(printf '%s\n' 1i "$(backup)" . wq) ed-s log.txtlog.txt.new&&mv log.txt

我有一个函数“backup”,这个函数从控制台的输出也被重定向到一个文件,操作如下:

backup > >(tee -a ./log.txt) 2>&1
它可以工作,但我想在文件的开头添加新的输出数据,就我的情况而言,似乎要明智地使用
ed
(而不是
sed
),我采用以下方式进行操作:

ed -s log.txt < <(printf '%s\n' 1i "$(backup)" . wq)

ed-s log.txt<如果我正确理解了您的代码-您正在尝试将备份命令的输出预挂起到log.txt文件的开头。此外,您正在尝试在控制台上查看备份输出

试试这个:

{
  backup 2>&1 | tee /dev/tty
  cat log.txt
} > log.txt.new
mv log.txt.new log.txt 
编辑:

以下是遵循Charles Duffy建议的代码版本:

cat <( backup 2>&1 | tee /dev/tty ) log.txt > log.txt.new && mv log.txt.new log.txt
cat&1 | tee/dev/tty)log.txt>log.txt.new&&mv log.txt.new log.txt

您的示例中有些地方不正确。第一个命令行使用
backup
函数写入log.txt,而第二个命令行使用
backup
读取log.txt。请注意,一般来说,将数据写入文件开头需要从头重写整个文件,当您要求他们进行就地更改时,
sed
ed
就是这样做的。因此,这是一个缓慢/昂贵的操作,需要足够的存储空间来拥有两个拷贝,至少是暂时的。最好尽可能避免这种需要。(传统的UNIX文件系统允许您以较低的成本将数据添加到文件末尾,或者通过在您选择的任何位置用不同的N字节替换N字节来更改内容,但不能插入新内容或用不同长度的新字符串替换旧字符串)。总之,便宜/简单/慢的东西是
cat-log.txt
。使用
ed
sed-i
等执行的任何命令实际上都是一样的。