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

awkработает по-другому на Solaris– версия, доступная в, /usr/binне поддерживает эту -vопцию. Используйтеnawkдля более POSIX-подобной версии.


Вторая проблема в том, что, как вы уже заметили, там всего одна строка. Не пытайтесь писать однострочные команды, если это не является абсолютно необходимым; читаемые команды легче исправить. Если вам нужно поместить команду в файл конфигурации где-то — поместите ее в скрипт .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"

Связанный контент