evalでのコマンド実行時のPIPESTATUSの参照(bash) [Linux]
bash では、PIPESTATUS を参照することにより、パイプラインの途中のコマンドの終了ステータスを取得できる。
% bash -c 'true|false|(exit 2); echo ${PIPESTATUS[@]}' 0 1 2
ほとんどの場合、@ を * に置き換えても同様の結果が得られる($@ と $* の違いと同様)。
しかし、eval でのコマンド実行時には、上記の方法では PIPESTATUS を参照できない。
cmd="command1 | command2 | command3" eval $cmd echo ${PIPESTATUS[@]}
このような場合には、下記のようにすることで参照可能である。
cmd="command1 | command2 | command3" eval "$cmd; STATUS=(\${PIPESTATUS[@]})" echo ${STATUS[@]}
2. サンプルコードと実行例
% expand -4 demo.sh #!/bin/bash exec_cmd() { local cmd="$1" test=${2:-0} local status=0 if [ $test = 1 ]; then echo $cmd else eval "$cmd; STATUS=(\${PIPESTATUS[@]})" echo "value of \${#STATUS[@]}: ${#STATUS[@]}" echo "value of \${STATUS[@]}: ${STATUS[@]}" status=${STATUS[0]} fi echo "status of 1st command: $status" return $status } log=`basename $0 .sh`.log exec_cmd "$1 2>&1 | tee $log" exit $?
% ./demo.sh echo\ aaa aaa value of ${#STATUS[@]}: 2 value of ${STATUS[@]}: 0 0 status of 1st command: 0 % echo $? 0
% ./demo.sh aaa ./demo.sh: line 10: aaa: command not found value of ${#STATUS[@]}: 2 value of ${STATUS[@]}: 127 0 status of 1st command: 127 % echo $? 127
3. 参考情報
存在しないホスト名が127.0.0.1に名前解決される [CentOS]
CentOS 6.9 において、存在しないホスト名が 127.0.0.1 に名前解決される。
% ping aaa PING aaa.private.net (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost.localdomain (127.0.0.1): \ icmp_seq=1 ttl=64 time=0.034 ms …
(補足)
・名前解決は、/etc/hosts、DNS の順に参照する。
(/etc/nsswitch.conf の設定)
・/etc/hosts に当該ホスト名は存在しない。
・DNS では当該ホスト名が名前解決されない(host aaa の実行)。
・/etc/resolv.conf には、ISP のネームサーバーの設定のみを行っている。
(domain/search の設定は行っていない。)
・ローカル・ドメインには、ダミーのドメイン名を付いている。
(private.net: 192.168.0.0)
・CentOS 7.3 でも同様である。
・Debian 7/8 では発生しない。
2. 対処方法
/etc/resolv.conf において、domain または search で ISP のドメイン名を設定する。
% ping aaa ping: unknown host aaa
リストア後のsystemd-journaldのエラー [CentOS]
発生事象と対処方法は、以下の通りである。
1. 発生事象
システムのリストア後に systemd-journald のエラーが発生する。
systemd-journald[807]: Failed to write entry (9 items, 267 bytes), \ ignoring: Bad address
2. 対処方法
下記の手順を実施する。
(1) ファイルの特定
# journalctl --verify
(2) 当該ファイルの削除
FAIL: と表示されるファイル(*.journal) を削除する。
(3) systemd-journald の再起動
# systemctl restart systemd-journald
3. 備考
systemd-journald のバグとのこと。
cf.
https://bugzilla.redhat.com/show_bug.cgi?id=1069828
https://access.redhat.com/discussions/2100681