Проверьте, существует ли переменная окружения для пользователя с правами su

Проверьте, существует ли переменная окружения для пользователя с правами su

Я занимаюсь этим уже несколько дней, мне нужно проверить для пользователя $1, существует ли переменная окружения $2.

Я попробовал несколько случаев:

 $ [[ -v a ]] && echo "a ok" || echo "a no"
 a no
 $ [[ -v $HOME ]] && echo "a ok" || echo "a no"
 a no 

(Так что нет (я пробовал на Bash > 4.2))

if [ su - ${1} -c "[ -z "${2}" ]" ]

Теперь я пробую этот подход, потому что не могу найти в чем проблема :/ !

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
su - root -c "echo "$HOME" | wc | sed 's/ //g'"

решение1

Синтаксис в ваших первых примерах неверный. Если вы напишете:

[[ -v $HOME ]]

Тогда вы фактически выполняете команду:

[[ -v /home/yourusername ]]

Что, конечно, обречено на провал. Вы хотите:

[[ -v HOME ]] && echo ok || echo no

Вы можете объединить это, чтобы suполучить:

su - root -c "[[ -v HOME ]]" && echo ok || echo no

Ваши последние примеры не будут работать, потому что вы не можете вкладывать кавычки, и потому что расширение переменной оболочки происходит до выполнения команды. То есть, учитывая:

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"

На самом деле команда, которую вы выполните, будет следующей:

su - root -c 'echo /home/somesuser | ...'

Если вам нужно значение $HOMEс точки зрения root, вам нужно будет предотвратить расширение переменных в локальной оболочке, например, с помощью одинарных кавычек:

su - root -c 'echo $HOME | ...'

Мне не ясно, почему вы передаете вывод в wc, потому что количество слов в $HOMEпочти всегда будет 1. Вместо того, чтобы постобрабатывать вывод wcс помощью sedили cut, вы можете просто использовать -wопцию для получения количества слов:

su - root -c 'echo $HOME | wc -w'

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