Когда оболочка выполняет линию echo -e "Deactivating $UserName shell account ..." "$(chsh -s /usr/bin/false $UserName)"
, вот последовательность событий:
- Оболочка работает
chsh -s /usr/bin/false Test2
, с его стандартный вывод происходит в буфер захвата, так что оболочка может использовать его позже.
chsh
обнаруживает, что «Test2» не существует и печатает «chsh: unknown user: Test2» в его stderr. Поскольку оболочка не делала ничего особенного со своим stderr, это происходит непосредственно в stderr оболочки, который является вашим терминалом.
chsh
выходит
- Оболочка принимает захваченное выход (примечание: стандартный вывод, а не Stderr) из
chsh
(там не было), и заменяет его в echo
командной строки, что дает echo -e "Deactivating Test2 shell account ..." ""
Примечание что сообщение об ошибке будет напечатано на шаге 2, но сообщение о том, что должно произойти, не будет напечатано до шага 4.
Существует несколько способов решения этой проблемы; обычно лучше всего избегать всего беспорядка захвата вывода команды, а затем повторять ее. Это бессмысленно и просто приводит к таким путаницам (и некоторым другим, с которыми вы не сталкивались). Просто запустите команду напрямую, и пусть ее выход (как stdout, так и stderr) переместится в их обычные места в обычном порядке.
BTW, я также рекомендую избегать echo -e
, или действительно echo -anything
. В POSIX standard for echo
говорится: «Реализации не должны поддерживать какие-либо варианты». Фактически, некоторые реализации поддерживают варианты; другие просто рассматривают их как часть строки для печати.Кроме того, некоторые интерпретируют escape-последовательности (например, \n
) в строках для печати, некоторые - нет, а некоторые только делают, если указан -e
(нарушая стандарт POSIX). Учитывая, насколько непредсказуемы эти функции, лучше всего избегать таких ситуаций iffy и вместо этого использовать printf
(что более сложно использовать, но гораздо более предсказуемо) или (как в вашем случае) просто используйте отдельную команду echo
для каждого линия.
Кроме того, вы должны почти всегда ссылки переменные двойные кавычки (например, groups "$UserName"
вместо groups $UserName
), только в случае, если они содержат пробелы, символы и т.д.
Основываясь на вышесказанном, вот как я бы написать сценарий:
echo # print a blank line
echo "Commencing user $UserName removal"
echo "Deactivating $UserName shell account ..."
chsh -s /usr/bin/false "$UserName"
echo "Listing group(s) user: "
groups "$UserName"
echo "Removing Crontab ... "
crontab -r -u "$UserName"
Спасибо вам всем. Гордон, ты и Игнасио отвечаете на работу; однако то, что я узнал от вас, заключается в том, что я НЕ НУЖДАЮСЬ ЭХО МОЕЙ КОМАНДЕ НА ВСЕХ !!! и убедившись, что на всякий случай нужно поставить UserName. благодаря – user3112318