usermod + awk 無効な構文

usermod + awk 無効な構文

特定のグループにユーザーを追加するコマンド (Solaris サーバー) を作成しようとしています。これはかなり長いコマンドなので、ここでコマンド全体を投稿し、その後で分解します。

USER=myUser && sudo /usr/sbin/usermod -G `awk -v delim="," -F: '/[:,]'$USER'/ { groups = groups $1 delim; } END { groups = groups "myGroup"; print groups}' /etc/group` myUser

内部awkコマンドは現在のグループのコンマ区切りリストをコンパイルし、外側のコマンドはこのリストを -G パラメータで受け取ります。

両方awkそしてユーザーモッド構文エラーが発生しています (1 行目付近ですが、行は 1 行しかありません)。しかし、1 つのエラーが他のエラーによって発生しているのではないかと思います。

ここで私が見逃している明らかな構文エラーはありますか? これはシェルの問題が原因でしょうか? 免責事項として、高レベルのテキスト処理の問題のため、セミコロンの代わりに && 構文を使用していますが、私の意見では、実行には影響しないはずです (テスト済み)。

答え1

awkSolarisでは動作が異なります– で利用可能なバージョンでは/usr/binこのオプションはサポートされていません-vnawkより POSIX に似たバージョンです。


2 つ目の問題は、すでにお気づきのとおり、1 行しかないことです。絶対に必要な場合を除き、1 行のコマンドを書こうとしないでください。読みやすいコマンドの方が修正が簡単です。コマンドをどこかの設定ファイルに記述する必要がある場合は、.sh代わりにスクリプトに記述してください。

一時変数として使用しないでください$USER。多くのプログラムでは、この変数にあなたのログイン名。$user代わりに次のような名前を選択してください。

/etc/groupなどの解析を実行するツールがある場合は、解析しないでくださいgroups。(コードが簡単になるだけでなく、ローカル以外のアカウントでも機能します。)

#!/bin/sh
user=myUser
group=myGroup
oldgroups=$(groups "$user" | sed "y/ /,/")
usermod -G "$oldgroups,$group" "$user"

または、どうしても

user=myUser && sudo usermod -G "$(groups "$user" | sed "y/ /,/"),myGroup" "$user"

関連情報