Если инструмент не выполняет то, что вы хотите, вы можете улучшить его с помощью сценария-оболочки. Я использую этот сценарий ( noenv
) для поддержания чистоты среды сборки. Использование его как
sudo -u powerlessuser noenv /bin/processCmd
сделает то, о чем вы просите. (Сценарий должен находиться по стандартному пути, в противном случае вы должны указать его в команде).
Скрипт:
#!/bin/sh
# $Id: noenv,v 1.3 2014/05/10 22:43:32 tom Exp $
# trim the environment to minimal (PATH may still be long...)
env | sed -e 's/=.*//' -e '/^[ ].*/d' | \
while true
do
read value
if test -z "$value" ; then
# honor assignments to variables in the parameter list
while test $# != 0
do
case "x$1" in
*=*)
eval $1
name=`echo "$1"|sed -e 's/=.*//'`
export $name
shift 1
;;
*)
break
;;
esac
done
exec "$@"
break
fi
case "$value" in
HOME|PATH|USER|_|SHLVL|TMPDIR|LOGNAME)
;;
*\ *|*\(*|*\)*|*\!*)
#echo "...skipping $value"
;;
*)
#echo value:"$value"
unset "$value"
;;
esac
done
Чтобы уточнить, я не писал это, используя / usr / bin / env
, потому что некоторые из систем, на которых я строил, не имели функции POSIX, о которой упоминалось в вопросе : параметр -i
. Это старые системы BSD, включая SunOS 4 и HPUX 10 (проверка моей памяти по странице руководства для «env» во FreeBSD).
Сценарий, кстати, обрезает многострочные значения (но вы можете столкнуться только с TERMCAP
, и это только на очень старых машинах). Второе выражение sed должно быть диапазоном с табуляцией и пробелом .
Для POSIX (который, вероятно, вас больше интересует), вы могли бы сделать что-то, что использует эту функцию для передачи выбранных значений из родительской среды, например,
env -i foo="bar"
, и поэтому оба варианта можно настраивать. Для большого набора переменных это может быть неудобно, и сценарий - лучший выбор.
sudo
в любом случае не одобряет TERMCAP
. Это в (длинном) списке переменных, которые он удачно удаляет из среды.
sudo
настаивает на установке определенных переменных. Читая исходный plugins / sudoers / env.c
, вы увидите этот фрагмент ближе к концу rebuild_env
:
/* Add the SUDO_USER, SUDO_UID, SUDO_GID environment variables. */
CHECK_SETENV2("SUDO_USER", user_name, true, true);
snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_uid);
CHECK_SETENV2("SUDO_UID", idbuf, true, true);
snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_gid);
CHECK_SETENV2("SUDO_GID", idbuf, true, true);
debug_return_bool(true);
, то есть непосредственно перед (единственным) успешным возвратом из этого функция, она устанавливает свои собственные переменные , используя свои собственные значения .
С учетом информации в комментариях к вопросу одно из следующих решений может быть адекватным.
Используйте псевдоним:
alias para123 = "$ HOME / software / Para / bin / paraview"
Используйте функцию оболочки:
para123 () {"$ HOME / software / Para / bin / paraview "" $ @ "; }
Используйте сценарий оболочки (называемый para123
):
#! / Bin / sh
"$ HOME / software / Para / bin / paraview "" $ @ "