Программа не работает при вызове через символическую ссылку

Если инструмент не выполняет то, что вы хотите, вы можете улучшить его с помощью сценария-оболочки. Я использую этот сценарий ( 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);

, то есть непосредственно перед (единственным) успешным возвратом из этого функция, она устанавливает свои собственные переменные , используя свои собственные значения .

4
03.10.2015, 01:15
1 ответ

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

  1. Используйте псевдоним:

     alias para123 = "$ HOME / software / Para / bin / paraview" 
     
  2. Используйте функцию оболочки:

     para123 () {"$ HOME / software / Para / bin / paraview "" $ @ "; } 
     
  3. Используйте сценарий оболочки (называемый para123 ):

     #! / Bin / sh 
     
     "$ HOME / software / Para / bin / paraview "" $ @ "
     
2
27.01.2020, 21:00

Теги

Похожие вопросы