SSブログ

evalでのコマンド実行時のPIPESTATUSの参照(bash) [Linux]

1. eval でのコマンド実行時の PIPESTATUS の参照(bash)


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. 参考情報


cf. https://stackoverflow.com/questions/21878286/how-to-access-the-bash-pipestatus-array-of-an-evald-command



存在しないホスト名が127.0.0.1に名前解決される [CentOS]

1. 発生事象


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]

CentOS 7.3 において、システムのリストア後に systemd-journald のエラーが発生するようになってしまった。
発生事象と対処方法は、以下の通りである。

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



この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。