![Необходимо обновить скрипты оболочки, чтобы они могли работать в различных версиях *nix.](https://rvso.com/image/97262/%D0%9D%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%20%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B%20%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8%2C%20%D1%87%D1%82%D0%BE%D0%B1%D1%8B%20%D0%BE%D0%BD%D0%B8%20%D0%BC%D0%BE%D0%B3%D0%BB%D0%B8%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C%20%D0%B2%20%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D1%85%20%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F%D1%85%20*nix..png)
У меня есть куча скриптов 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/sh
shebang, который, несмотря на распространенное мнение,нет 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
таким образом у меня есть только один скрипт, но его можно использовать на всех хостах.