このコマンドが失敗するのはなぜですか(実際のコマンドを単純化したバージョンです)。
/tmp $ echo 74.6.231.20 | xargs -n1 -I {} echo "$(host -d {})"
Trying "74.6.231.20.<REDACTED>.<REDACTED>.com"
Trying "74.6.231.20"
Host 74.6.231.20 not found: 3(NXDOMAIN)
Received 95 bytes from 10.163.24.1#53 in 1 ms
これ所有者コマンドは74.6.231.20をIPアドレスではなくホスト名と見なすため、コマンドは失敗します(例:74.6.231.20ホスト名/ FQDNはありません)。
IPアドレスを直接指定してください。
/tmp $ echo 216.58.195.78 | xargs -n1 -I {} echo "$(host -d 216.58.195.78)"
Trying "78.195.58.216.in-addr.arpa"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21425
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;78.195.58.216.in-addr.arpa. IN PTR
;; ANSWER SECTION:
78.195.58.216.in-addr.arpa. 85730 IN PTR sfo07s16-in-f78.1e100.net.
78.195.58.216.in-addr.arpa. 85730 IN PTR sfo07s16-in-f14.1e100.net.
Received 113 bytes from 10.163.24.1#53 in 2 ms
削除するエコこのコマンドは次のように動作します。
/tmp echo 74.6.231.20 | xargs -n1 -I {} sh -c "(host {})"
20.231.6.74.in-addr.arpa domain name pointer media-router-fp73.prod.media.vip.ne1.yahoo.com.
問題は、xargsとechoの組み合わせとxargsが{}文字列置換を実行する方法のようです。
psの回避策があることを知っています。主に、このコマンドが正常に実行されないようにする破損した対話を見つけることに興味があります。ありがとうございます。
ベストアンサー1
これは、シェルがコマンドライン引数をコマンドに引数として渡す前に変数とコマンドの置換を実行するために発生します。したがって、$(host -d {})
2xargs
番目echo
のコマンドは実際に次のように出力します。
Trying "{}.<REDACTED>.<REDACTED>.com"
Trying "{}"
Host {} not found: 3(NXDOMAIN)
Received 95 bytes from 10.163.24.1#53 in 1 ms
その後、xargs
出力をIPアドレスに置き換えて、コマンドが失敗したように見えます。次のコマンドを使用して、パイプラインを実行する前に直接確認できます。{}
host
set -x
( set -x; echo 74.6.231.20 | xargs -n1 -I {} echo "$(host -d {})" )
+ echo 74.6.231.20
++ host -d '{}'
+ xargs -n1 -I '{}' echo 'Trying "{}.<REDACTED>.<REDACTED>.com"
Trying "{}"
Host {} not found: 3(NXDOMAIN)
Received 95 bytes from 10.163.24.1#53 in 1 ms'
Trying "74.6.231.20.<REDACTED>.<REDACTED>.com"
Trying "74.6.231.20"
Host 74.6.231.20 not found: 3(NXDOMAIN)
Received 95 bytes from 10.163.24.1#53 in 1 ms
この特定の例で出力を表示したい場合は、host
出力をキャプチャして明示的に表示する必要はありませんecho
。これだけで十分です。
echo 74.6.231.20 | xargs -n1 host -d
編集する:
xargs
以下は、複数のコマンドに入力を渡す方法の例です。これはbash
、コマンドの後に続くすべての引数が-c
位置引数として割り当てられるために機能します$0
。
echo 74.6.231.20 | xargs -n1 -I '{}' /bin/bash -c 'echo "$0"; host -d "$0"' '{}'