実行時に問題なくコマンドラインから直接実行でき、それを$1
LDAPでチェックインしたい実際のグループ名に置き換えることができるいくつかのコマンドがあります。これをパラメータ化された関数に置き換えたいのですが、何も印刷するためのエラーメッセージやエコーを取得できません。
コマンドラインの.zshrcに次のコードを追加してzshから呼び出すことができる関数に変換するにはどうすればよいですか? (公開用に若干調整)
alias ldapuserlookup=" /usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b 'ou=Groups,o=.com' '(cn=$1)' memberuid | sed 's/memberuid: //g')"
予想出力:
username1
username2
username3
この質問は百万回は受け取ったはずですが、どのキーワードを検索に入れなければ便利な例になるのかわかりません。その多くはbash用であるか、私がやっている作業には合いません。
答え1
ソリューションの最後まで下にスクロールできますが、実際に何が起こっているのかを理解することが重要なので、ここに完全な分析があります。
答えには3つのレベルがあります。
1. 指定したコマンドにエラーがあります。)
引数の末尾に追加の項目があり、sed
次のエラーが出力されます。
zsh: parse error near `)'
$(...)
(私はこれが構文を使用しようとしている間に残っているかもしれないと思います)
2.エイリアスを使用して、ユーザー提供のパラメーターに対して機能すると予想されるコマンドを実行しています。この場合、代わりに関数を使用したいと思います。
エイリアスは、本質的にコマンド名の文字列を置き換えるためのシェルヘルパーであり、通常:alias ll='ls -al'
などの追加オプションフラグを使用します。alias grep='grep --color=auto'
「また、エイリアスにはコマンドの動作を簡単に中断することができるいくつかの注意事項がありますが、これはこの質問に具体的に答えられる範囲を超えています。
特定の場合に使用したいです。機能むしろ、コマンド引数を受け入れ、必要に応じて解析するように設計されているからです。エイリアスと同様に動作するため、特定の端末内だけでなくグローバルに動的に初期化できるため、両方の側面で最高です。また、実際のスクリプトの多様性を持ちながらスクリプトファイルを生成する手間もありません。
エイリアスを関数として再フォーマットするには、次のように宣言します(注:これはまだ完全な解決策ではありません。):
ldap_userlookup(){
# It is standard practice to use '_' as separator function names
/usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b 'ou=Groups,o=.com' '(cn=$1)' memberuid | sed 's/memberuid: //g'
}
メモ:コマンドの前に追加することは、
echo
シェルが特定のコマンドを解析する方法を確認する良い方法です。完全なデバッグ出力にも使用できますが、set -x
これは非常に冗長です。
次の2つのプレフィックス宣言を使用すると、提供された引数のecho
解析の違いを確認できます。
alias testalias='echo "/usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b ou=Groups,o=.com (cn=$1) memberuid " '
test_func(){
echo "/usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b ou=Groups,o=.com (cn=$1) memberuid " }
- 悪い:宣言された別名を使用して実行すると、
testalias argtest
次のようになります。
/usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b ou=Groups,o=.com (cn=) memberuid testarg
与えられた引数がコマンドに期待されるのではなくコマンドの末尾に追加されるので、これは明らかに望ましい動作ではありません(cn=$1
)
- いいね:この関数を使用すると、
test_func argtest
次のようになります。
/usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b ou=Groups,o=.com (cn=testarg) memberuid
**ご覧のように、私たちが宣言した関数はコマンドライン引数を解析し、argtest
コマンド内の適切な場所に配置できます。つまり、cn=
**
三。'
可変引数を使用しており、bash
どちらもzsh
次の規則に従います。内部に含まれる変数は'
拡張されませんが、内部に含まれる変数は"
拡張されます。
関数内に配置されていても、コマンド(明確にするためにパイプを再度削除する)が使用された変数ラッパーに基づいて解析される方法は次のとおりです。
'
関数内で変数の周りに一重引用符を使用する
test_func(){
echo "/usr/bin/ldapsearch -LLL -x -h ldap.com -s su -b 'ou=Groups,o=.com'" '(cn=$1)' memberuid
}
実行中test_func argtest
無効な出力:
/usr/bin/ldapsearch -LLL -x -h ldap.com -s su -b 'ou=Groups,o=.com' (cn=$1) memberuid
- 二重引用符で関数型を再指定します(上書きされることを示すために前の
"
不要な引用符を保持します)。'
"
test_func(){
echo "/usr/bin/ldapsearch -LLL -x -h ldap.com -s su -b 'ou=Groups,o=.com'" "'(cn=$1)'" memberuid
}
実行中test_func argtest
良い出力:
/usr/bin/ldapsearch -LLL -x -h ldap.com -s su -b 'ou=Groups,o=.com' '(cn=argtest)' memberuid
完璧なソリューション:
完全な関数宣言(パイプのecho
削除、追加、二重引用符を使用)は、必要な動作を提供する必要があります。sed
ldap_userlookup () {
/usr/bin/ldapsearch -LLL -x -h "ldap.com" -s "sub" -b "ou=Groups,o=.com" "(cn=$1)" memberuid | sed 's/memberuid://g'
}
テストして動作したら、基本に追加してすべてのターミナル~/.zshrc
ウィンドウにロードしたり、この関数と他のカスタム関数を定義したzsh
別のファイルを作成したりできます。必要に応じて皮をむきます。~/.zsh_functions
source ~/.zsh_functions