2016-09-06 4 views
0

У меня есть относительная длинная коллекция скриптов, которые я сейчас оцениваю, и внося изменения в источник, чтобы выполнить тот же набор скриптов как в Linux, так и в блоках SunOS. Часть кода имеет простой Grep так:Универсальный подход к grep для Linux и Solaris

#Linux 
echo -e "\n foo \n bar \n test ok" | grep -Evw 'foo|bar' 

Моя портирование попытка работает нормально, если перевести как:

#SunOS 
echo -e "\n foo \n bar \n test ok" | /usr/xpg4/bin/grep -Ev 'foo|bar' 

Есть ли способ, чтобы написать один оператор в Bash для работы в обоих сценариях ? Или, должен ли я быть мысленно подготовлен, чтобы начать выполнять дополнительные инструкции if/else для каждой операционной системы?

В этом случае, кажется, что/bin/Grep может сделать и регулярных выражений и слов соответствия, а затем с/USR/BIN/Grep мы только можем сделать слово и не так:

$ echo -e "\n foo \n bar \n test ok" | grep -Evw 'foo|bar' 
grep: illegal option -- E 
Usage: grep [-c|-l|-q] -bhinsvw pattern file . . . 
$ echo -e "\n foo \n bar \n test ok" | /usr/xpg4/bin/grep -Evw 'foo|bar' 
Usage: grep [-c|-l|-q] [-bhinsvwx] pattern_list [file ...] 
    grep [-c|-l|-q] [-bhinsvwx] [-e pattern_list]... [-f pattern_file]... [file...] 
    grep -E [-c|-l|-q] [-bhinsvx] pattern_list [file ...] 
    grep -E [-c|-l|-q] [-bhinsvx] [-e pattern_list]... [-f pattern_file]... [file...] 
    grep -F [-c|-l|-q] [-bhinsvx] pattern_list [file ...] 
    grep -F [-c|-l|-q] [-bhinsvx] [-e pattern_list]... [-f pattern_file]... [file...] 

ответ

3

Is there a way to write a single statement in Bash to work in both scenarios?

Да.

Or, should I be mentally prepared to start implementing additional if/else statements for each operating system?

Нет, этого следует избегать, когда это возможно. В вашем случае все может быть выполнено с использованием стандартных команд, поэтому нет необходимости добавлять код, специфичный для ОС.

Это портативный способ сделать это. Это должно работать на всех Unix, как машины:

PATH=`getconf PATH`:$PATH # Should be done once at the beginning of scripts. 

printf "\n foo \n bar \n test ok" | grep -Ev '\<foo\>|\<bar>\' 

getconf PATH возвращает путь к POSIX-совместимые команд на всех Unix/Unix, как реализации.

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

\<...\> - это способ POSIX для указания границ слов с расширенными регулярными выражениями.

Обратите внимание, что я не использовал $(getconf PATH), но старый синтаксис `getconf`, потому что на Solaris 10 вы можете использовать устаревшую оболочку Bourne.

+0

Теперь это элегантно, мне нравится! – supertonic09

3

Как насчет положить что-то подобное, что в верхней части ваших скриптов:

[ -d /usr/xpg4/bin ] && PATH="/usr/xpg4/bin:$PATH" 

Затем следующая строка будет работать на обеих системах:

echo -e "\n foo \n bar \n test ok" | grep -Evw 'foo|bar' 

Идея, конечно, состоит в том, чтобы проверить, существует ли каталог /usr/xpg4/bin, и если это так, мы можем предположить, что он содержит grep, который поддерживает нужные нам параметры (предположительно GNU grep). Поэтому просто добавьте этот каталог в начало $PATH, чтобы он занимал наивысший приоритет.

+0

Я думаю, что это отличная идея - и, вероятно, в конечном итоге будет использоваться этот общий подход ...но, к сожалению, я все еще получаю сообщение об ошибке: '~ $ [-d/usr/xpg4/bin] && PATH ="/usr/xpg4/bin: $ PATH "' '~ $ echo -e" \ n foo \ n bar \ n test ok "| grep -Evw 'foo | bar'' 'Использование: grep [-c | -l | -q] [-bhinsvwx] pattern_list [файл ...]' '[...]' '~ $ echo $ PATH' '/ usr/xpg4/bin:/usr/bin:/usr/sbin:/usr/local/git/bin' – supertonic09

+0

Можете ли вы добавить' which -a grep' сразу после строки '$ PATH' и запустить его в вашей системе Solaris, чтобы увидеть, что он печатает? – redneb

+0

-a, похоже, не работает, но он, кажется, есть: '~ $, который grep /usr/xpg4/bin/grep' – supertonic09

0

Одно решение поставить после притон:

grep_path=/usr/lib/gnu/bin # <- EDIT ME 
PATH=$grep_path:$PATH 

# will work on any platform with a GNU grep 
grep foobar file 

 Смежные вопросы

  • Нет связанных вопросов^_^