Назад | Перейти на главную страницу

Что такое хороший универсальный ПУТЬ для платформ * nix от различных поставщиков?

Работа в гетерогенной среде всегда является проблемой. Имея предприятие с AIX, IRIX, HPUX, Ultrix, Solaris и несколькими разновидностями Linux, что является хорошей универсальной настройкой PATH, которая позволяет использовать хороший общий набор команд, но также включает дополнительные функции, такие как ifconfig, ping , и make, которых часто нет по умолчанию?


$HOME/bin:$HOME/sbin:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/ccs/bin:/usr/ucb

В частности, вы не хотите слепо добавлять $ PATH в .bashrc, иначе у вас будет беспорядок в оболочке sub-sub-sub-sub. Вы хотите включить все каталоги sbin, потому что там могут быть важные инструменты. Вы хотите включить / usr / ccs / bin: / usr / ucb, поскольку Solaris помещает туда несколько вещей, которые вы, вероятно, будете использовать.

В частности, отсутствуют бесконечные варианты выбора для локальных установок программного обеспечения, например инструменты GNU - обычно вы хотите, чтобы они были в PATH перед версиями системы. Кроме того, я исключил каталоги, которые, скорее всего, будут полезны в качестве исторического любопытства, такие как / etc и / usr / libexec.

Это бесконечно спорно, должен ли Solaris / USR / к.х.н. / бен быть до или после версии GNU утилит. На самом деле, из-за этого у вас будут периодические проблемы, независимо от того, какой путь вы выберете.

Я использую комбинацию проверок и тестов, чтобы установить свой путь в любой данной системе через мой .bashrc / .profile:

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

# Bootstrap
unset PATH
PATH="/usr/bin:/bin:/sbin:/usr/sbin"

# What is the OS and Revision?
if [ -x /bin/uname ] || [ -x /sbin/uname ] || [ -x /usr/bin/uname ]; then
    OS=`uname -s`
else
    OS="unknown"
fi

Затем вы можете добавить пути, специфичные для ОС:

case $OS in
    Linux)
        ...
    ;;
    SunOS|Solaris)
        ck_add2path /usr/ucb /usr/ccs/bin
    ;;
esac

Где ck_add2path определяется как:

function add2path () {
    for NEWPATH in ${1+"$@"}; do
        if [ -z "$PATH" ] ; then
            export PATH="$NEWPATH"
        elif [ -z `echo ":$PATH:"|grep $NEWPATH` ] ; then
            export PATH="$PATH:$NEWPATH"
        fi
    done
    unset NEWPATH
}

function ck_add2path () {
    for NEWPATH in ${1+"$@"}; do
        NEWPATH=`echo $NEWPATH | sed 's/\/\//\//g'`
        if [ -d $NEWPATH ]; then
            add2path $NEWPATH
        fi
    done
    unset NEWPATH
}

Для root пользователь, я был бы очень осторожен; и под этим я подразумеваю, что не пытаюсь использовать общий PATH, сделайте это для каждой ОС, если вам нужно.

UNAME=`uname -s`
if [ "x${UNAME}" = "xLinux" ]; then
elif ....

Небольшая дополнительная работа, но вам не нужно никаких сюрпризов.

Для не-root, так много ...

  • / {bin, sbin}
  • / usr / {bin, sbin}
  • / opt / {bin, sbin}
  • / usr / local / {bin, sbin}
  • / sw / bin

Проблема, с которой я сталкивался в прошлом, особенно с AIX, заключается в том, что для некоторых команд вы хотите, чтобы сторонняя установка имела приоритет, поэтому, например, вы помещаете / opt / bin перед / bin. Позже все ломается, потому что другие утилиты полагаются на PATH, чтобы предоставить им собственный инструмент в / bin /.

Они находятся «там», но часто в / sbin и / или / usr / sbin. Мой .bashrc включает:

# I'm a sysadmin, RAAR!
PATH="${PATH}":/usr/sbin:/sbin

# set PATH so it includes user's private bin if it exists
if [ -d ~/bin ] ; then
    PATH=~/bin:"${PATH}"
fi  

Я начал с сохранения своего старого пути перед его изменением, чтобы последующие вызовы моих сценариев запуска не приводили к постоянному увеличению значений PATH ... Но через некоторое время я просто установил для него хороший эмпирически установленный базовый уровень.

Я хотел X11 (хотя бы для вызова eval resize на удаленных сеансах ssh для установки переменных среды COLUMNS и LINES)

Я добавил / usr / css / bin, потому что у некоторых из моих голых установок Solaris не было make в пути (и даже меньше было cc или gcc!)

Конечно, был добавлен набор путей / usr / local /, а затем вся информация в моем домашнем каталоге (как с архитектурно-зависимыми путями, так и без них) и '.'.

Строка с '.' в пути сомнительно, однако, если вы root.

OLDPATH=/bin:/usr/bin:/usr/5bin:/usr/bsd:/usr/ucb:/sbin:/usr/sbin
PATH=${OLDPATH}
PATH=${PATH}:/usr/openwin/bin:/usr/bin/X11:/usr/local/X11/bin
PATH=${PATH}:/usr/ccs/bin
PATH=/usr/local/bin:${PATH}
PATH=${PATH}:/etc:/usr/etc:/usr/local/etc
PATH=.:${HOME}/bin/`uname`:${HOME}/bin:${PATH}
export PATH

Эта установка хорошо зарекомендовала себя в AIX, HPUX, IRIX, Ultrix, Solaris и Linux. Может быть, даже на тех древних аполлонах (кто-нибудь уже видел / usr / 5bin?)

Я поддерживаю программный подход Dsully к тестированию каталогов и добавлению путей. Кроме того, когда я добавляю $dir к $PATH, Я обычно добавляю $dir/../man к $MANPATH (если он существует).