В сценариях оболочки config, как я могу объяснить различия между coreutils на BSD по сравнению с GNU?

До этого месяца мои конфигурации оболочки были довольно простыми (просто как .bashrc или .bash_profile с некоторыми псевдонимами в основном), но я реорганизовал его, чтобы я мог различать поведение в зависимости от того, использую ли я zsh и bash. Сначала они генерируют общий файл конфигурации оболочки, который должен работать для чего угодно, а затем специализируется на использовании конкретной оболочки (я символически ссылаюсь на это).

Сегодня я был удивлен, когда перестал работать. Оказалось, что во время рефакторинга .bashrc был псевдоним

 alias ls='ls --color=always' 

что ломало вещи для ls в bash на терминале в OSX. Как только я увидел, что BSD любит -G для цвета, но GNU (или что-то еще на Ubuntu) нравится – --color , было ясно, что существует несколько вариантов.

Мой вопрос заключается в том, как лучше всего учитывать различия в вариантах и ​​между BSD и GNU coreutils? Должен ли я тестировать переменную env в блоках, чтобы увидеть, какая ОС используется и применять правильное поведение? Или имеет смысл делать отдельные файлы конфигурации для каждой ОС?

Хотя ответы на эти вопросы могут быть субъективными, кажется, что это краткое изложение разницы между BSD и GNU coreutils и стратегиями для их работы, чтобы сделать универсальную конфигурацию, используемую для большинства * nix, была бы довольно объективной.

  • Каков шрифт, используемый для документации GNU?
  • Коррумпированные файлы после извлечения с помощью GNU tar Cywin
  • Ричард Столлман сравнивает Linux с Windows
  • Почему команда GNU find -execdir ведет себя иначе, чем поиск BSD?
  • ssh от экрана приводит к неизвестной ошибке терминала
  • Как определяется порядок работы tar в файлах?
  • Где я могу найти RPM для mailfromd для CentOS 6?
  • Где я могу использовать «beadm»?
  • 3 Solutions collect form web for “В сценариях оболочки config, как я могу объяснить различия между coreutils на BSD по сравнению с GNU?”

    Единственный надежный способ написания скриптов, поддерживающих разные операционные системы, – это использовать только функции, определенные POSIX.

    Для таких вещей, как ваши личные конфигурации оболочки, вы можете использовать хаки, которые соответствуют вашему конкретному варианту использования. Что-то вроде следующего уродливо, но достигнет цели.

     if ls --version 2>/dev/null | grep -q 'coreutils'; then alias ls='ls --color=always' else alias ls='ls -G' fi 

    Затухание кода с помощью операторов if для работы с ключом типа coreutils действительно работает, однако чистое программное решение для обработки различных типов – это использование полиморфизма . Поскольку это Bash, у нас нет полиморфизма как такового, но я возился со способом подделать его. Единственное требование состоит в том, чтобы ваш .bashrc файл и т. Д. .bashrc организован в функции.

    Сначала я создаю тест для типа платформы coreutils :

     get_coreutils_platform() { local ls_version="$(ls --version 2>/dev/null)" if [[ "$ls_version" == *"GNU coreutils"* ]]; then echo gnu else echo bsd fi } 

    Затем мы можем отправить по типу:

     platform=$(get_coreutils_platform) define_standard_aliases_$platform configure_shell_vars_$platform 

    Вот реализация BSD :

     define_standard_aliases_bsd() { define_standard_aliases } configure_shell_vars_bsd() { configure_shell_vars export CLICOLOR=1 } 

    (Обратите внимание, что мы используем переменную CLICOLOR для включения цветов вместо использования alias , который кажется более мелким чище)

    И имплементация GNU :

     define_standard_aliases_gnu() { define_standard_aliases alias ls='ls --color=auto' } configure_shell_vars_gnu() { configure_shell_vars } 

    Для полноты, вот пример реализации «абстрактной базы»:

     define_standard_aliases() { alias ll='ls -l' alias l.='ls -d .*' } configure_shell_vars() { export EDITOR=vim } 

    Не прямой ответ на ваш вопрос, но у меня есть сценарии-оболочки для обработки таких вещей, а не дополнительное усложнение в .bashrc. Например, вот мой l-скрипт, который обрабатывает ваш случай здесь кросс-платформенным способом:

    http://www.pixelbeat.org/scripts/l

    Linux и Unix - лучшая ОС в мире.