Лучший / традиционный метод работы с PATH в нескольких средах UNIX - PullRequest
3 голосов
/ 08 октября 2010

Основной вопрос здесь: существует ли стандартный метод написания сценариев оболочки UNIX, который будет работать на нескольких платформах UNIX.

Например, у нас много хостов, работающих под разными версиями UNIX (Solaris, Linux)и в разных версиях все с немного разными схемами файловой системы.Некоторые хосты имеют whoami в / usr / local / gnu / bin /, а некоторые в /usr/bin/.

Кажется, что все наши скрипты справляются с этим немного по-другому.У некоторых есть операторы case в архитектуре:

case "`/script/that/determines/arch`" in 
  sunos-*) WHOAMI=`/usr/local/gnu/bin/whoami` ;;
  *)       WHOAMI=`/usr/bin/whoami` ;;
esac

При таком подходе вы точно знаете, какой двоичный файл выполняется, но довольно громоздко, если выполняется много команд.

Некоторые простоустановите PATH (на основе скрипта arch выше) и вызывайте команды только по их имени.Это удобно, но вы теряете контроль над тем, какую команду вы выполняете, например, если у вас есть:

/bin/foo
/bin/bar
/other/bin/foo
/other/bin/bar

Вы не сможете использовать и /bin/foo, и /other/bin/bar.

Другой подход, который я мог бы придумать, - иметь локальный каталог на каждом хосте с символическими ссылками на каждый двоичный файл, который будет необходим на каждом хосте.Например:

Хост Solaris:

/local-bin/whoami -> /usr/local/gnu/bin/whoami
/local-bin/ps -> /usr/ucb/ps

Хост Linux:

/local-bin/whoami -> /usr/bin/whoami
/local-bin/ps -> /usr/ps

Какие другие подходы используют люди?Пожалуйста, не говорите, напишите сценарий на Python ... есть некоторые задачи, где bash является наиболее лаконичным и практичным средством выполнения простой задачи.

Ответы [ 2 ]

4 голосов
/ 08 октября 2010

Я делегирую все это моему .profile, в котором есть тщательно продуманная серия внутренних функций, чтобы попытаться добавить каталоги в PATH.За исключением OSX, который, я считаю, в принципе невозможен, потому что каждый Darwin / Fink / Ports хочет контролировать свой PATH, этот подход работает достаточно хорошо.

Если меня беспокоит неоднозначность (несколько экземпляров foo в разных каталогахв моем PATH), я бы изменил функции, чтобы идентифицировать все неоднозначные команды и требовать ручного разрешения.Но для моей среды это никогда не было проблемой.Моя главная задача состояла в том, чтобы иметь один .profile, который работает на Debian, Red Hat, Solaris, BSD и так далее.Подход «попробуйте все каталоги, которые могли бы работать», работает достаточно хорошо.

0 голосов
/ 08 октября 2010

Чтобы установить PATH в POSIX-совместимые каталоги, вы можете сделать следующее в начале ваших сценариев Bash:

unset PATH
PATH="$(PATH=/bin:/usr/bin getconf PATH)"
export PATH

Если вы знаете, что можете использовать Bash в разных системах Unix, вы можете использовать встроенные оболочкивместо внешних команд, чтобы улучшить переносимость.Пример:

help type
type -a type

type -P ls  # replaces: which ls

Чтобы отключить поиск псевдонимов / функций для таких команд, как find, ls, ... в Bash, вы можете использовать встроенную команду.Пример:

help command

command ls -l

Если вы хотите быть на 100% уверены, что выполнили определенную команду, расположенную в определенном каталоге, использование полного пути к исполняемому файлу кажется подходящим.Первый матч выигрывает в поиске PATH!

...