В сценариях оболочки 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, была бы довольно объективной.

  • egrep не работает должным образом в системе SunOS
  • Буферизация (называемая) в GNU OS
  • Как предотвратить автоматизацию от перезагрузки INSTALL?
  • Почему xargs -I подразумевает -L 1
  • Отключить файлы резервных копий GNU Indent
  • Можно ли изменить ядро ​​в системе UNIX / Linux?
  • Как переместить вновь созданный файл в определенное место в tarfile
  • Почему «.» работать в chown?
  • 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

    Interesting Posts

    Как проверить, действительно ли токен действителен на сервере iComet?

    Как вы находите путь к каталогу?

    Динамически обновлять список завершений в zsh

    Могу ли я ограничить конкретного пользователя использованием только localhost?

    Как я могу быть уверен, что доступ к моему домашнему серверу из моей домашней сети не осуществляется через Интернет?

    Драйверы для Sapphire HD 4870 GDDR 512 для Ubuntu

    Как открыть все URL-адреса в моем браузере с помощью xdg-open?

    Shell Script не отправляет электронное письмо из задания Cron

    Почему эти две команды «cat» приводятся по-разному?

    Скрипт для проверки использования файловой системы и свободного пространства

    AttributeError: объект 'module' не имеет атрибута 'INotifyWrapper'

    Установите пакет на OS X 10.11.5, используя apt-get

    Как автоматизировать веб-браузер, поддерживающий javascript?

    Как перечислить все дескрипторы окна Wine, принадлежащие выбранному окну PID?

    bash: несколько команд на одной строке с другим кодом выхода

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