システムを更新するzsh関数があります(.deb
パッケージ、pip
パッケージ、texliveパッケージ、...)。
次のようになります。
up() {
emulate -LR zsh
[[ -d "${HOME}/log" ]] || mkdir "${HOME}/log"
LOGFILE="${HOME}/log/update_system.log"
__update_system 2>&1 | tee -a "${LOGFILE}"
}
最後の行は__update_system
関数を呼び出し、その出力をtee
にパイプします。この出力は端末に出力を表示し、ファイルに追加する必要があります。違う。
__update_system
によって実行されるコマンドの1つは次のとおりです。
$ apt-file update
実行されているようですが、その出力はファイルに記録されていません。他のすべてのコマンド(aptitude update
を含む)がログに記録されます。
私はシェルでこのコマンドを実行して理解しようとしました:
$ apt-file update >/tmp/log
繰り返しますが、apt-file update
は実行されているようですが、/tmp/log
が空であるため、出力は記録されません。
出力はおそらく標準エラーで送信されると思ったので、試しました:
$ apt-file update >/tmp/log 2>&1
しかし、私は同じ結果、空のファイルを得ました。
Bashで試してみましたが、空のファイルも生成されました。
私のシステムの詳細は次のとおりです。
$ uname -a
Linux ubuntu 4.4.0-135-generic #161-Ubuntu SMP Mon Aug 27 10:45:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Zshについて:
$ zsh --version
zsh 5.5.1-dev-0 (x86_64-pc-linux-gnu)
Bashについて:
$ bash --version
GNU bash, version 4.4.0(1)-release (x86_64-unknown-linux-gnu)
apt-file
について:
$ aptitude show apt-file
Package: apt-file
State: installed
Automatically installed: no
Version: 2.5.5ubuntu1
Priority: optional
Section: universe/admin
Maintainer: Ubuntu Developers <[email protected]>
Architecture: all
Uncompressed Size: 92,2 k
Depends: Perl, curl, libconfig-file-Perl, libapt-pkg-Perl, liblist-moreutils-Perl, libregexp-assemble-Perl,
libfile-temp-Perl
Suggests: openssh-client, Sudo
Description: search for files within Debian packages (command-line interface)
apt-file is a command line tool for searching files contained in packages for the APT packaging system. You can search
in which package a file is included or list the contents of a package without installing or fetching it.
apt-file update
の出力をファイルにリダイレクトする方法は?
apt-file
はPerlスクリプトです。stdout
ではなく/dev/tty
に書き込みます(違いはこの SO answer で説明されています)Soooo ...これは、出力をlogfile.log
に記録します
script -c "apt-file update" logfile.log