Засорение кода операторами 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
}
Нет, это невозможно. Клиент 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 , доступном здесь).