Вплоть до этого месяца мои конфиги оболочки были довольно просты (в основном с псевдонимами .bashrc
или .bash_profile
с некоторыми псевдонимами), но я проводил рефакторинг, чтобы я мог получить различное поведение в зависимости от того, использую ли я zsh и bash. Сначала они получают общий конфигурационный файл оболочки, который должен работать для чего угодно, а затем специализируются на конкретной используемой оболочке (см. Ссылку на это).
Я был удивлен сегодня, когда ls
перестал работать. Оказалось, что во время рефакторинга .bashrc
был псевдоним
alias ls='ls --color=always'
это сломало вещи ls
в bash на терминале в OSX. Как только я увидел, что BSD ls
любит -G
цвет, а GNU (или что-то еще в Ubuntu) нравится --color
, стало ясно, что довольно много вариантов различаются.
Мой вопрос заключается в том, каков наилучший способ учета различий в параметрах и таковых между BSD и GNU coreutils? Должен ли я проверить переменную env в if
блоках, чтобы увидеть, какая ОС используется и применить правильное поведение? Или имеет смысл создавать отдельные конфигурационные файлы для каждой ОС?
Хотя ответы на эти вопросы могут быть субъективными, это выглядит как краткое изложение различий между базовыми утилитами BSD и GNU, и стратегии, позволяющие обойти их для создания универсальной конфигурации, пригодной для использования на большинстве * nix, были бы довольно объективными.
ls -c
отличается отls --color
. Отредактировал ваш вопрос, чтобы исправить.Ответы:
Единственный надежный способ написания сценариев, поддерживающих разные операционные системы, - это использовать только те функции, которые определены в POSIX.
Для таких вещей, как ваши личные настройки оболочки, вы можете использовать хаки, которые соответствуют вашему конкретному случаю использования. Что-то вроде следующего ужасно, но достигнет цели.
источник
coreutils
явно, почему бы просто не проверить, работает ли цветовой флаг, напримерif ls --color=auto -d / >/dev/null 2>&1; then ...
.Засорение кода
if
инструкциями для переключения типа coreutils работает, однако чистое программирующее решение для обработки различных типов заключается в использовании полиморфизма . Поскольку это Bash, у нас нет полиморфизма как такового, но я бездельничал, пытаясь подделать его. Единственное требование - чтобы ваш.bashrc
файл и т. Д. Были организованы в функции.Сначала я создаю тест для платформы типа coreutils :
Затем мы можем отправить на основе типа:
Вот реализация BSD :
(Обратите внимание, что мы используем
CLICOLOR
переменную для включения цветов вместо использованияalias
, которое кажется немного чище)И GNU претворение в жизнь:
Для полноты, вот пример реализации "абстрактной базы":
источник
ls
в вашем диспетчере, а неcat
, тем более, что ни один из ваших псевдонимов не включаетcat
.--color=auto
указывать второй и третий псевдонимы, поскольку первый псевдоним добавляет эту опцию кls
.alias
это рекурсивно. Это позволяет мне сделать пример намного проще.Не прямой ответ на ваш вопрос, но у меня есть сценарии-обертки для обработки подобных вещей, а не дополнительные сложности в .bashrc. Например, вот мой сценарий l, который обрабатывает ваше дело здесь кросс-платформенным способом:
http://www.pixelbeat.org/scripts/l
источник