2014-11-15 2 views
2

Я хочу привязать команду к комбинации клавиш в zsh, которая отличается от OSX и Linux. Мое текущее состояние:В какой операционной системе работает мой терминал?

if [[ "$(uname)" == "Darwin" ]]; then 
    bindkey "^e" some-command # Ctrl+E for OSX 
else 
    bindkey "^[e" some-command # Alt+E for Linux 
fi 

Однако это не работает для соединений ssh ​​между этими двумя системами. Так что на самом деле, я не хочу проверять, в какой операционной системе находится моя оболочка, но скорее в которой работает мой терминал. Есть ли способ получить эту информацию?

Пожалуйста, не сосредотачивайтесь на деталях ключей, используемых в привязке. Это не имеет значения в данный момент :)

Edit: Чтобы сделать вещи яснее:

  • Терминал является штуковина, вы вводите свои команды в, как Iterm2, Guake или Xterm
  • Скорлупа штуковина, которая принимает и выполняет команды, как Bash, Zsh или Fish

ответ

2

ssh может отправлять переменные среды на сервер и делает это по умолчанию для нескольких переменных. Хотя любая информация о операционной системе клиентов не является частью этого списка по умолчанию, ее можно расширить.

  1. Необходимо установить и экспортировать переменную, имеющую необходимую информацию. Вы можете пойти с выходом uname или просто скопировать OSTYPE (вы не должны использовать OSTYPE напрямую, так как изменение его может быть не очень хорошей идеей). Так что вам нужно что-то вроде этого в вашем ~/.zshrc на обеих системах (где-то на вершине, прежде чем вам это нужно, конечно):

    export CLIENT_OSTYPE=${CLIENT_OSTYPE:-$OSTYPE} 
    

    CLIENT_OSTYPE Это устанавливает на значение OSTYPE, если она была ранее установлена. Поэтому, если вы входите в систему локально, он будет установлен в OSTYPE. Но если вы входите в систему с ssh, он будет установлен на CLIENT_OSTYPE, который был передан.

  2. Теперь вы должны установить, что ваши клиенты SSH фактически передают серверу CLIENT_OSTYPE. Для этого необходимо изменить конфигурацию SSH клиента SendEnv входа - либо пользователя специфические (~/.ssh/config) или глобально (Скорее всего /etc/ssh/ssh_config на Linux, /etc/ssh_config на Mac):

    SendEnv CLIENT_OSTYPE 
    

    Это может быть уже установлен в некоторое значение в глобальная конфигурация (LANG LC_* в моем случае), в этом случае просто добавить к списку:

    SendEnv LANG LC_* CLIENT_OSTYPE 
    
  3. Наконец, вы должны настроить сервера SSH на самом деле принять это переменное окружение.Это может быть сделано в /etc/ssh/sshd_config на Linux и /etc/sshd_config на Mac путем модификации AcceptEnv:

    AcceptEnv CLIENT_OSTYPE 
    

    Подобно SendEnv это также может быть уже установлен на что-то:

    AcceptEnv LANG LC_* CLIENT_OSTYPE 
    

Затем вы можете использовать значение CLIENT_OSTYPE, чтобы решить, какую конфигурацию вы хотите использовать.

-1

Я думаю, что ш Команда ell arch может помочь вам здесь.

Он также расскажет вам, есть ли вы на 32-разрядной или 64-разрядной машине MacOS.

+1

'arch' только показывает информацию о системе, в которой запущена ** shell **. Кроме того, она доступна только в OSX (что было бы решением проблемы, если она могла быть вызвана из системы linux) но он не может). – eugenk

+0

fwiw, ["' arch' "существует в версиях Linux, которые я использую] (https://wiki.archlinux.org/index.php/man_page). –

+0

О, тогда я не увидел нужный пакет в результатах поиска AUR. По крайней мере, он недоступен по умолчанию на моей машине ArchLinux. – eugenk

Смежные вопросы