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

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

  • Regex ищет корни слова с общими префиксами
  • Ричард Столлман сравнивает Linux с Windows
  • gtga для cygwin
  • Буферизация (называемая) в GNU OS
  • Таблицы с разделителями пробелов в CSV со стандартными инструментами обработки текста
  • Можно ли изменить ядро ​​в системе UNIX / Linux?
  • Почему gnustep-config ничего не выводит ни на какой параметр?
  • Выполните действие при обнаружении вторжения шасси
  • Как узнать, сколько окон открыто на экране GNU?
  • Пониженный GNU не работает
  • с учетом регистра gnu mv на Mac OS X
  • Interesting Posts

    Устанавливает ли debian setup с lvm также шифрование раздела подкачки?

    перенаправить веб-сервер без ip-адреса и переадресации портов в livebox

    Нормальный текстовый файл, обнаруженный файлом как текст программы ASCII Pascal

    Установите GRUB `лифт = крайний срок 'планирование на одно устройство

    Обход / удаление ссылки на неисправный диск

    Могу ли я ограничить общий cputime, используемый группой?

    Как расширить логический и расширенный раздел с помощью fdisk

    Как выполнить 'find' с 'sed' в функции bash

    Ubuntu unattended install: echo keypress to dialog

    Как удалить окрашенные красные метки / линии на экране?

    Как совместить строку, содержащую символ «$» с grep?

    OpenVPN – Ошибка привязки Socket на локальном адресе IP: 1194: Невозможно назначить запрошенный адрес

    Не удалось установить dahdi – / usr / bin / install: не может stat '': нет такого файла или каталога

    Рабочая станция с высокой задержкой для VM-ориентированной рабочей станции по сравнению с малой задержкой (но хак-иш) для Oracle 11g

    Поиск «отмены» файла с отверстиями (GNU)

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