web-dev-qa-db-ja.com

STDOUTなしのteeコマンドの代替

スーパーユーザーのアクセス許可が頻繁に必要なファイルに書き込みまたは追加できるように| Sudo tee FILENAMEを使用しています。

状況によってはなぜ役立つのかは理解できますが、teeも入力をSTDOUTに送信するので、実際にteeのその部分を実際に使用したことはありません。ほとんどの場合、追加の手順を実行せずに手動でtee 1> /dev/nullを使用して沈黙させないと、この機能によって画面に不要なジッタが発生するだけです。

私の質問:teeとまったく同じことをするコマンドアラウンドがありますが、デフォルトでは何もSTDOUTに出力しませんか?

37
aef

パイプを介して/dev/zeroに戻るのを避ける別のオプションは、

Sudo command | Sudo dd of=FILENAME
30

ddソリューションは、依然としてジャンクをstdoutに出力します。

$ 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

残念ですが、ティーにはstdoutを抑制するオプションがありません。

7
Curt

スクリプトを使用できます。つまりこのようなもの、つまり$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

次を実行してください:

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

4
Luca Stein

コマンド全体をSudoにラップできるので、シェル自体とリダイレクトはrootとして実行されます。

Sudo sh -c 'do_something > FILENAME'
2
Thunderbeef

ルート所有ディレクトリに対してファイルを作成しようとする

$ ls -la /opt/ | head -2
total 0
drwxr-xr-x   3 root  wheel   96 Jun 13  2019 .
$ touch /opt/bufu
touch: /opt/bufu: Permission denied

厄介なリダイレクトを使用してファイルを作成し、イベントをログに記録し、ファイルコンテンツをstdoutに、ある程度並行して、確実に同時に書き込みます。

$ cat /tmp/test.sh
#!/bin/sh

file=/opt/bufu
message="an embarrassing failure"
rm -rf $file

{ echo $file \
    | tee /dev/fd/2 \
    | xargs Sudo sh -c 'echo $1 >$2' _ "$message"
} 2>&1 \
    |
{ tee /dev/fd/3 \
    | xargs logger -s "Create File"

} 3>&1 \
    |
{ xargs cat \
    | xargs -I% echo file content is "%"
}
$ /tmp/test.sh
rm: /opt/bufu: Permission denied
Feb  7 17:03:16  bufu[4039] <Notice>: Create File /opt/bufu
file content is an embarrassing failure

おい、それが不快な位置に強制されているのはティーのせいではない-xargs shを使用するか、独自のワンライナーを書く

cat <<eof >./aef
echo "$1" >$2
eof
..
Sudo aef "is a cool guy" /opt/fubar
0