私は、ルートLDAPレコードを1回だけ取り出して出力をtee
にパイプして、各セクションのprettyプリンターを呼び出すLDAPエントリー用のきれいなプリンターを作成しようとしています。プロセス置き換えの誤解を持つティー
私のgroup_entry
関数は、特定のLDAP DNのLDIFを返します。詳細は重要ではありませんので、のは、それが常に返すとしましょう:
dn: cn=foo,dc=example,dc=com
cn: foo
owner: uid=foo,dc=example,dc=com
owner: uid=bar,dc=example,dc=com
member: uid=foo,dc=example,dc=com
member: uid=baz,dc=example,dc=com
member: uid=quux,dc=example,dc=com
custom: abc123
を私は簡単に「INGのとcut
」grep
のビットで個別に所有者とメンバーを抽出INGすることができます。これらの二次DNを別のLDAP検索クエリにパイプして、実際の名前を取得することができます。例のために、のは、私はpretty_print
機能を持っているとしましょう、それはLDAP上parametrisedさは、私が今述べたことすべてをした、属性名、次にAWKとうまくすべてをフォーマット:
$ group_entry | pretty_print owner
Owners:
foo Mr Foo
bar Dr Bar
$ group_entry | pretty_print member
Members:
foo Mr Foo
baz Bazzy McBazFace
quux The Artist Formerly Known as Quux
これらを個別に正常に動作しますが、
$ group_entry | tee >(pretty_print owner) | pretty_print member
Members:
[Sits there waiting for Ctrl+C]
はもちろん、私はこれが動作するようになっている方法についていくつかの誤解がありますが、それは私をエスケープ:私はそれらを一緒に
tee
しようとすると、何も起こりません。私は間違って何をしていますか?
完全を期すために、ここに私の完全なスクリプトは、EDITです:
#!/usr/bin/env bash
set -eu -o pipefail
LDAPSEARCH="ldapsearch -xLLL"
group_entry() {
local group="$1"
${LDAPSEARCH} "(&(objectClass=posixGroup)(cn=${group}))"
}
get_attribute() {
local attr="$1"
grep "${attr}:" | cut -d" " -f2
}
get_names() {
# We strip blank lines out of the LDIF entry, then we always have "dn"
# followed by "cn" records; we strip off the attribute name and
# concatenate those lines, then sort. So we get a sorted list of:
# {{distinguished_name}} {{real_name}}
xargs -n1 -J% ${LDAPSEARCH} -s base -b % cn \
| grep -v "^$" \
| cut -d" " -f2- \
| paste - - \
| sort
}
pretty_print() {
local attr="$1"
local -A pretty=([member]="Members" [owner]="Owners")
get_attribute "${attr}" \
| get_names \
| gawk -F'\t' -v title="${pretty[${attr}]}:" '
BEGIN { print title }
{ print "-", gensub(/^uid=([^,]+),.*$/, "\\1", "g", $1), "\t", $2 }
'
}
# FIXME I don't know why tee with process substitution doesn't work here
group_entry "$1" | pretty_print owner
group_entry "$1" | pretty_print member
あなたの実際のコード+あなたの間違った出力+あなたの予想される出力を共有することができれば、私たちはあなたをより良く助けることができます。 – Inian
もう一つの問題は、 'pretty_print owner'への呼び出しが' tee'と同じ場所から標準出力を継承していることです。これは 'pretty_print member'がいくつかの追加の予期しない入力を得ることを意味します。 – chepner
2つの 'pretty_print'呼び出しが非同期に実行されるので、出力が同じファイルに書き込まれているとインターリーブされる可能性があります。 – chepner