Несколько FIFOS Over SSH

Засорение кода операторами 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
}

0
19.12.2018, 21:57
1 ответ

Нет, это невозможно. Клиент sshявно закрывает каждый открытый файловый дескриптор больше 2:

/*
 * Discard other fds that are hanging around. These can cause problem
 * with backgrounded ssh processes started by ControlPersist.
 */
closefrom(STDERR_FILENO + 1);

Это почти первое, что происходит при запуске клиента (см. main()в исходном коде OpenSSH 8.0 , доступном здесь).

0
28.01.2020, 04:07

Теги

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