Необходимо обновить скрипты оболочки, чтобы они могли работать в различных версиях *nix.

Необходимо обновить скрипты оболочки, чтобы они могли работать в различных версиях *nix.

У меня есть куча скриптов ksh и csh, которые нужно обновить для работы в разных вариантах *nix (Red Hat Linux, HP UX, Solaris). Оболочки монтируются в домашнем каталоге каждого из наших серверов, и нам нужно, чтобы они работали в каждой среде.

У нас есть проблемы с некоторыми конкретными командами, которые не встречаются в Linux. Например, скрипты используют nawk, который следует заменить gawkна Linux.

Скрипты также используют, /usr/xpg4/bin/grepпотому что в Solaris grepне поддерживается опция -q (тихий режим), но grep в Linux поддерживает, а в этой среде /usr/xpg4/bin/grepее не существует.

Я не хочу трогать каждый скрипт, поэтому ищу более глобальное решение.

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

Я могу добавить символическую ссылку в системные каталоги, но тогда мне понадобятся права администратора для управления этой «фиктивной» настройкой, и наша настройка больше не будет переносимой...

Я не привык к системному администрированию, поэтому мне может не хватать стандартного решения для такого рода нужд.

Что я могу сделать, чтобы иметь переносимый скрипт, не переписывая их все?

решение1

Правильный подход — придерживаться POSIXсовместимых команд (т. е. использовать awk, not nawkили gawk, grep, not /usr/xpg4/bin/grep), опций и синтаксиса и настраивать их PATHтаким образом:

PATH=$(getconf PATH):$PATH

или в Solaris при использовании устаревшей оболочки Bourne:

PATH=`getconf PATH`:$PATH

и все, ваши скрипты, запущенные там, должны работать без изменений. Избегайте использования #!/bin/shshebang, который, несмотря на распространенное мнение,нет POSIXсовместимый. Просто не используйте shebang вообще. Вы можете использовать, command -v shпоэтому посмотрите, какая POSIXоболочка доступна на вашей машине.

Однако, похоже, вы хотите сохранить непереносимые скрипты без изменений. Тогда вы можете сохранить ранее предложенный подход для команд, использующих синтаксис, POSIXи добавить интерфейс для непереносимых команд, которые будут обрабатываться в других ОС. Поскольку ваши скрипты используют оболочки в стиле Bourne или Csh, псевдонимы и функции не будут переносимыми, поэтому лучше использовать собственную библиотеку скриптов-оболочек, которую вы поместите перед своим PATH. Например:

ш / кш / баш / ... :

PATH=~/bin:`getconf PATH`:$PATH 

csh:

set path = ( ~/bin `getconf PATH` $path)

-

mkdir -p ~/bin
cd ~/bin
cat > awk <<%
#!/bin/sh
PATH=`getconf PATH`:$PATH awk "$@"
%
ln -s awk nawk
ln -s awk gawk

решение2

В таком случае я использую переменные

AWK=awk
GREP=grep

затем протестируйте операционную систему

if [ $(uname -s) == "SunOS" ]
then
  AWK=/usr/bin/nawk
  GREP=/usr/xpg4/bin/grep
fi

(повторите для redhat, suse, hp-ux, aix)

и используйте переменную после

if $GREP -q whatever /some/file
then
   $AWK -F: '{....}' /some/file
fi

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

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