我想寫一個漂亮的打印機的LDAP條目,它只獲取一次根LDAP記錄,然後管輸出到tee
調用每個部分漂亮的打印機。與進程替換誤解的三通
爲了便於說明,例如我的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
我可以很容易地提取業主和成員分別與一點點grep
「荷蘭國際集團和cut
」荷蘭國際集團。然後,我可以將這些輔助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
這些做工精細獨立,但當我嘗試tee
在一起,什麼都不會發生:
$ group_entry | tee >(pretty_print owner) | pretty_print member
Members:
[Sits there waiting for Ctrl+C]
很顯然,我對此是如何工作的一些誤解,但我想不起來了。我究竟做錯了什麼?
編輯爲了完整起見,這裏是我完整的腳本:
#!/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
還有兩個調用'pretty_print'異步運行的問題,所以如果它們正在寫入同一個文件,它們的輸出可能會交錯。 – chepner