вывод в неправильном порядке при использовании разных методов печати/эхо/вывода

Вопрос или проблема

Распечатка оболочки не в порядке и отсутствует некоторая информация.

Я совершенно новичок в Linux и нахожусь на этапе “копировать/вставить и посмотреть, что произойдет”.
Я уже пробовал искать в Google, но безрезультатно.

Я запускаю скрипт, который использует несколько способов получения текущего пользователя.
Скрипт использует

  • прямые вызовы
  • вызовы с использованием sudo
  • вызовы с использованием sudo su -

Каждый метод должен возвращать 6 значений, вместо этого первые два метода возвращают 5 значений, а третий метод возвращает все 6 значений плюс одно лишнее, которое, я предположительно, берется из второго метода, просто с задержкой.

Вопросный скрипт:

#!/usr/bin/env bash

echo ""

echo "GET USER - DIRECT"
echo ""
whoami
echo $USER
id -u -n
logname
ps -o user= -p $$ | awk '{print $1}'
echo $SUDO_UID
echo $SUDO_USER

echo ""
read -p "Press enter to continue"
echo -e "\n"

echo "GET USER - SUDO"
echo ""
sudo whoami
sudo echo $USER
sudo id -u -n
sudo logname
sudo ps -o user= -p $$ | awk '{print $1}'
sudo echo $SUDO_UID
sudo echo $SUDO_USER

echo ""
read -p "Press enter to continue"
echo -e "\n"

echo "GET USER - SUDO SU -"
echo ""
sudo su -c 'whoami; echo $USER; id -u -n; logname; ps -o user= -p $$ | awk "{print $1}"; echo $SUDO_UID; echo $SUDO_USER; echo ""'
echo -e "\n"

Вывод, который я получаю:

player1@Arcade:~/Desktop$ ./testuser.sh

GET USER - DIRECT

player1
player1
player1
player1
player1



Press enter to continue


GET USER - SUDO

[sudo] password for player1: 
root
player1
root
player1
player1



Press enter to continue


GET USER - SUDO SU -

root
root
root
player1
root
1000
player1



Что я здесь упускаю? Мое предположение заключается в том, что прямой вызов $SUDO_UID и $SUDO_USER связан с разрешениями. Порядок, в котором происходит вывод, все еще ставит меня в тупик.

Ответ или решение

Ваша проблема с несоответствием вывода функций в bash-скрипте может быть обусловлена несколькими факторами, связанными с переменными окружения и особенностями работы команд в Linux. Ознакомьтесь с анализом каждой части вашего скрипта и причинами, по которым вывод может работать неоднозначно.

Проблемы с доступом к переменным окружения

  1. Переменные окружения в разных контекстах:

    • Переменные $SUDO_UID и $SUDO_USER существуют только в контексте привилегированного пользователя и отображаются только в случае, если они явно установлены. В вашем случае, выполнение без sudo приводит к отсутствию этих переменных.
    • Использование sudo может не сохранить контекст переменных окружения, и они сохраняются только в том сеансе, который выполняется с привилегиями.
  2. Разные результаты команд:

    • Результаты команд whoami, $USER, id -u -n, logname и других могут отличаться в зависимости от текущего пользователя, привилегий пользователя и контекста, в котором они выполняются (например, использование sudo или sudo su -).

Понять задержку вывода и взаимное влияние команд:

  1. Задержка команд в Direct и Sudo:

    • В вашем скрипте команда echo $USER выполняется после смены контекста пользователя через sudo. В этом случае вывод команды будет связан с пользователем, кто инициировал команду, а не актуальным пользователем, если только не используются кавычки или эскейпинг для сохранения контекста.
  2. Использование sudo su - и различие в контексте:

    • Эта команда создает новый сеанс shell с собственным окружением, и поэтому вывод может быть другим. Порядок выполнения команд может измениться, если команды не строго последовательны или если влияние среды (например, TERM) изменяет интерпретацию.

Рекомендации:

  1. Следование строгому контексту:

    • Убедитесь, что вы понимаете, какой пользовательский контекст ожидается для каждой команды, и в этом контексте интерпретируйте вывод команды.
  2. Использование эскейпингов и кавычек:

    • Для переменных окружения и сложных команд используйте кавычки и другие элементы bash для управления интерпретацией, где это возможно.
  3. Логирование и отладка:

    • Включите отладочные выводы в ваш скрипт с помощью set -x и set +x в целях анализа, чтобы видеть конкретные изменения при выполнении команд и их влияние на окружение.

Ваш сценарий будет проще отлаживать и управлять, если вы будете внимательно следить за изменением контекста выполнения команд и их переменными среды. Это особенно важно для мультиязычных систем, где различие в форматах и конфигурациях может вводить дополнительные сложности.

Оцените материал
Добавить комментарий

Капча загружается...