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

Для завершения этого в стиле, использующем только созданный-ins, необходимо было бы использовать оценку:

d=12

for i in `eval echo {0..$d}`
do
echo $i
done

Но с seq:

lowerlimit=0
upperlimit=12

for i in $(seq $lowerlimit $upperlimit)
do
echo $i
done

Лично я нахожу использование seq быть более читаемым.

9
18.03.2014, 14:38
3 ответа

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

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

if ls --version 2>/dev/null | grep -q 'coreutils'; then
    alias ls='ls --color=always'
else
    alias ls='ls -G'
fi
9
27.01.2020, 20:06
  • 1
    , который я играл вокруг с различными методами, и я думаю, что Ваше "ужасное" решение довольно хорошо и даже настолько ужасно. Как оказалось, я не заметил несоответствие в опциях для ls ранее, потому что я использовал GNU coreutils от Портов. Это - пример, почему выполнение, 'если' на $OSTYPE может не обеспечить желаемые результаты. –  labyrinth 07.12.2013, 08:27
  • 2
    Существует ли способ подавить ошибку, которая прибывает из, "если ls - версия", когда GNU coreutils не присутствуют (но все еще смочь протестировать на coreutils)? –  labyrinth 07.12.2013, 18:48
  • 3
    О, nevermind о подавлении ошибки. Я просто перенаправляю stderr к/dev/null прежде, чем передать по каналу к grep, и он работает, как я хотел бы. большое спасибо –  labyrinth 07.12.2013, 18:54
  • 4
    Вместо того, чтобы искать coreutils явно, почему не только тестируют, работает ли цветной флаг, например. if ls --color=auto -d / >/dev/null 2>&1; then .... –  Mikel 18.03.2014, 14:32
  • 5
    @mikel, если Вы только обеспокоены цветом (как в примере), который прекрасен. Если Вы заботитесь о других функциях также, проверение на coreutils полезно. –  jordanm 18.03.2014, 18:15

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

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

0
27.01.2020, 20:06

Засорение кода операторами if для переключения типа coreutils действительно работает, однако чистое программное решение для обработки различных типов состоит в использовании полиморфизма . Поскольку это Bash, у нас нет полиморфизма как такового, но я пытался найти способ подделать его. Единственное требование - ваш файл .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 для включения цветов вместо использования псевдонима , который кажется более чистым)

И имплементация 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
}
3
27.01.2020, 20:06

Теги

Похожие вопросы