fping
コマンドライン引数の順序に従って常に連続した結果を取得したい。
たとえば、次のコマンド:
fping -e 151.101.129.164 8.8.8.8
出力は次のようになります:
8.8.8.8 is alive (5.43 ms)
151.101.129.164 is alive (63.2 ms)
上記の結果は、fping
コマンドの引数とは異なる順序になっています。コマンド151.101.129.164
では が最初に置かれますfping
が、結果では 2 番目に表示されます。
151.101.129.164
最初の fping コマンドの順序を変更せずに、結果を最初に表示するにはどうすればよいですか?
答え1
1 つの方法は、ラッパー スクリプトを記述することです。
#!/bin/sh
myfile=$(mktemp)
fping "$@" > "$myfile"
for arg
do
case "$arg" in
(-*) # Ignore options
;;
(*) grep "^$arg " "$myfile"
esac
done
rm "$myfile"
したがって、これを呼び出してmyfping
実行すると( スクリプトをPATH内のディレクトリにmyfping -e 151.101.129.164 8.8.8.8
追加するか、そのディレクトリに配置する必要があります)、実行されます。./
fping -e 151.101.129.164 8.8.8.8一時ファイルに出力し、コマンドラインの順序 (左から右) で引数を調べて、結果を順番に取り出します。
ノート:
IPv4 アドレス パーサーは非常に柔軟性が高く、ほとんどの (すべてではないにしても) システムでは
127.0.1
と同等として解釈されます127.0.0.1
。したがって、fping 127.0.1
とfping
入力して で始まる出力行を生成し127.0.1
、 のような引数も入力すると1.7.0.1
、 は に一致する正規表現として扱われます127.0.1
。この問題は次のようにして回避できます。#!/bin/bash myfile=$(mktemp) ./fping "$@" > "$myfile" for arg do case "$arg" in (-*) # Ignore options ;; (*) darg=$(sed 's/\./\\./g' <<< "$arg") grep "^$darg " "$myfile" esac done rm "$myfile"
ここで、
arg
はに1.7.0.1
変換されますが、 には一致しません。darg
1\.7\.0\.1
127.0.1
上記のスクリプトは「here文字列」( )があるためbash固有のものです。これをPOSIX準拠にするには、次の行を
<<< "$arg"
変更します。darg=
darg=$(printf "%s" "$arg" | sed 's/\./\\./g')
- 上記は誤解を招くかもしれない。もしあなたが
fping 127.0.1
、fping
かもしれないアドレスを正規化し、 の結果を報告します127.0.0.1
。すると、 はgrep
それを見つけられません。 または、見つけられないかもしれません。 のバージョンを確認してくださいfping
。 - またはのような引数を持つオプションを使用する場合、スクリプト内のロジックはオプション引数を通常の引数、つまりターゲット ホスト名/アドレスであるかのように扱います。これはおそらく問題にはなりません。
-c count
-I interface
case
*
、[
…]
、またはその他の特殊文字を含む引数がある場合、grep
予期しない結果が生じる可能性があります。これは実際には問題にならないようです。fping
ターゲット ホスト名/アドレス引数に対応しない情報を出力する場合、その情報は表示されません。- このスクリプトは からの終了ステータスで終了しません
fping
。これを修正するのは演習として残されています。