替代不带 STDOUT 的 tee 命令

aef*_*aef 47 linux command-line posix tee

我正在使用| sudo tee FILENAME能够写入或附加到经常需要超级用户权限的文件。

尽管我理解为什么它在某些情况下很有用,但它tee也会再次将其输入发送到 STDOUT,但我从未真正将其tee用于任何有用的部分。在大多数情况下,如果我不采取额外的步骤并使用tee 1> /dev/null.

我的问题:是否有一个命令 arround,它的作用与 完全相同tee,但默认情况下不向 STDOUT 输出任何内容?

小智 32

另一个避免管道回送的选择/dev/zero

sudo command | sudo dd of=FILENAME
Run Code Online (Sandbox Code Playgroud)

  • http://superuser.com/a/850294/68284 描述了额外的 `oflag=append conv=notrunc` 选项以使用 `dd` 进行追加。 (4认同)

Cur*_*urt 13

dd解决方案仍然打印垃圾标准错误:

$ ls | sudo dd of=FILENAME
0+1 records in
0+1 records out
459 bytes (459 B) copied, 8.2492e-05 s, 5.6 MB/s
Run Code Online (Sandbox Code Playgroud)

使用以下status选项可以避免这种情况:

command | sudo dd status=none of=FILENAME
Run Code Online (Sandbox Code Playgroud)

另一个有趣的可能性(无论如何对于 Linux):

command | sudo cp /dev/stdin FILENAME
Run Code Online (Sandbox Code Playgroud)

要将 TTY 输入复制到文件中,我经常这样做:

sudo cp /dev/tty FILENAME
Run Code Online (Sandbox Code Playgroud)

太糟糕了 tee 没有抑制标准输出的选项。


Luc*_*ein 6

你可以使用脚本。即把这样的东西放在 ie 中$HOME/bin/stee0tee或者类似的:

#!/bin/bash

argv=
while [[ "$1" =~ ^- ]]; do
    argv+=" $1"
    shift
done

sudo tee $argv "$1" > /dev/null
Run Code Online (Sandbox Code Playgroud)

#!/bin/bash

sudo tee "$@" > /dev/null
Run Code Online (Sandbox Code Playgroud)

使其可执行:

$ chmod 755 钢

现在做即:

$ ls -la | stee -a /root/foo

  • 的确。想亲自看看。很久以前我用 C 编写了一个程序,它完成了你的要求,但它已经很久没有被遗忘了。当时几乎没有人对它感兴趣。但话又说回来,我实际上并没有做太多广告。 (2认同)

小智 6

我会添加 asponge作为替代方案。

在 Ubuntu 或其他基于 Debian 的发行版上,您可以使用以下命令安装它sudo apt install -y moreutils

请注意,与此相比,存在一些差异,您可以在此处此处tee阅读更多内容

与 shell 重定向不同,sponge 在写入输出文件之前吸收所有输入。这允许构建读取和写入同一文件的管道。

对于我的典型用例来说,这种差异实际上是一个优势。