不带 STDOUT 的 tee 命令的替代方案

不带 STDOUT 的 tee 命令的替代方案

| sudo tee FILENAME经常使用它来写入或附加需要超级用户权限的文件。

虽然我理解在某些情况下它很有用,但它tee也会将其输入再次发送到 STDOUT,但我从未真正将这一部分tee用于任何有用的目的。在大多数情况下,如果我不采取额外措施并使用 手动将其静音,此功能只会导致我的屏幕充满不必要的抖动tee 1> /dev/null

我的问题是:是否存在一个命令,它的功能与完全相同tee,但默认情况下不会向 STDOUT 输出任何内容?

答案1

避免将材料输送回去的另一种方法/dev/zero

sudo command | sudo dd of=FILENAME

答案2

解决dd方案仍然会将垃圾信息打印到 stderr:

$ 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

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

command | sudo dd status=none of=FILENAME

另一个有趣的可能性(对于Linux而言):

command | sudo cp /dev/stdin FILENAME

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

sudo cp /dev/tty FILENAME

遗憾的是 tee 没有抑制 stdout 的选项。

答案3

您可以使用脚本。在 ie 中输入类似以下内容$HOME/bin/stee0tee或类似内容:

#!/bin/bash

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

sudo tee $argv "$1" > /dev/null

#!/bin/bash

sudo tee "$@" > /dev/null

使其可执行:

$ chmod 755 stee

现在执行 ie:

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

答案4

您可以将整个命令包装到 sudo 中,因此 shell 本身以及重定向将按如下方式执行root

sudo sh -c 'do_something > FILENAME'

相关内容