Как я могу передать команды по каналу к какому-либо терминалу?

При попытке использовать подобные менеджеры окон (xwem, крысиный яд) впервые, я сначала также пытался следовать за вовлечением инструкций по установке xmodmap для получения ключа модификатора для менеджера окон но затем я чувствовал то использование xmodmap в моих системных причинах некоторая путаница, потому что в моей системе (дистрибутив ALTLinux) внимание всегда обращалось на многоязычную настройку клавиатуры через XKB, а не через xmodmap.

Так, я нашел опцию XKB маркировать ключ, который я хотел как "Hyper" и затем использовал модификатор "Hyper" в конфигурации для xwem или крысиного яда.

В моем случае, опции к setxkbmap :

 -option altwin:hyper_win

и вот комментарий, который я сохранил по случаю добавления его к моей установке:

xemacs-xwem использует Hyper, таким образом, я нашел, что это предопределило карту XKB (в xkb/symbols/altwin), который использует ключи WIN.

Возможно, позже я составлю другую карту XKB для меня, скажем, использование правильного Управления как Hyper (который будет форсировать события для использования правильного Управления - теперь, моя рука просто игнорирует его).

Я думал, что это - больше очевидного способа для получения ключ Hyper через XKB, а не через xmodmap (как описано в документах XWEM), потому что:

  1. конфигурация xmodmap модифицирующих клавиш, кажется, не хороший w.r.t. путем, это вынуждает представить намерения: нужно сказать что-то о произвольно пронумерованных битах модификатора, но я не хочу думать об этих технических вещах: Мне нужен просто модификатор "Hyper", не некоторые неясные манипуляции с внутренностями! В xmodmap я должен был бы дать 2 или даже 3 неясных оператора для достижения результата, хотя логически это - единственное желание и операция. (Один xmodmap оператор не был бы достаточно, cf. Предупреждения XEMAC (FIXME: вставьте!), если Вы отображаете Control_R на modN; существуют некоторые технические ограничения.)

  2. каждый - рассказанные истории, которые XKB и xmodmap не играют хорошо вместе, так, чтобы не все X программ работали приятно и когерентно при смешивании их (я должен дать ссылку здесь, FIXME).

Вот соответствующее определение от /usr/share/X11/xkb/symbols/altwin, если кому-то интересно:

partial modifier_keys 
xkb_symbols "hyper_win" {
    key <LWIN> {    [   Hyper_L         ]   };
    key <RWIN> {    [   Hyper_R         ]   };
    modifier_map Mod4   { Hyper_L, Hyper_R };
};
4
10.02.2014, 08:36
2 ответа

После этого можно очень хорошо заставить тот последний ваш план работать. Для команды, отправленной будущим образом, чтобы не быть обработанным оболочкой, это должно быть в форме строки, когда достигает канала (таким образом echo "command", нет echo `command`). Затем это должно быть считано фоновым процессом (одинаково демон, но не обязательно) запустился в соответствующем терминале. Это должно быть оценено тем же процессом.

Но это - бойлер-platey, чтобы иметь сценарий на канал. Поэтому давайте обобщим создание сценария как term-pipe-r.sh (не забывайте chmod +x это!):

#!/bin/bash

pipe=$1                     # the pipe name is the first argument
trap 'rm -f "$pipe"' EXIT     # ignore exit and delete messages until the end

if [[ ! -p $pipe ]]; then   # if the pipe doesn't exist, create it
    mkfifo $pipe
fi

while true                  # cycle eternally..
do
    if read line <$ pipe; then
        if [[ "$line" == 'close the term-pipe pipe' ]]; then
            break
            # if the pipe closing message is received, break the while cycle
        fi

        echo                # a line break should be used because of the prompt 
        eval $line          # run the line: as this script should be started
    fi                          # in the target terminal, 
done                            # the line will be run there.

echo "<pipe closing message>"   # custom message on the end of the script

Поэтому скажите, что Вы хотите /dev/tty3 получить команды: просто пойдите туда, сделайте

./term-pipe-r.sh tty3pipe &     # $1 will be tty3pipe (in a new process)

И отправить команды, от любого терминала (даже от себя):

echo "command" > tty3pipe

или петлять там:

cat some-script.sh > tty3pipe

Обратите внимание, что эта передача по каналу игнорирует файлы как .bashrc, и псевдонимы там, такой как alias ls='ls --color'. Надежда это помогает кому-то там.

Редактирование (примечание - преимущество недемона):

Выше я говорил о читателе канала, не являющемся демоном обязательно, но на самом деле, я проверил различия, и оказывается, что это - путь лучше, чтобы быть простым фоновым процессом в этом случае. Поскольку этот путь, когда Вы закрываете терминал, EXIT сигнал (SIGHUP, SIGTERM, или безотносительно), получен сценарием также, и канал удален затем (см., что строка запускается с trap в сценарии) автоматически, избегая бесполезного процесса и файла (и возможно другие, если было такое перенаправление к бесполезному каналу).

Редактирование (автоматизация):

Однако, это скучно для запущения скрипта, который Вы (я, по крайней мере), вероятно, хотите большую часть времени. Так, давайте автоматизируем его! Это должно запуститься в любом терминале, и одна вещь, которую все они читают, .bashrc. Плюс, это сосет для использования ./term-pipe-r.sh. Так, можно сделать:

cd /bin # go to /bin, where Bash gets command names
ln -s /directory/of/term-pipe-r.sh tpr  # call it tpr (terminal pipe reader)

Теперь для выполнения его Вам только было бы нужно tpr tty3pipe & в /dev/tty3 каждый раз, когда Вы хотели бы. Но почему делают это, когда можно было сделать его автоматически? Таким образом, это должно быть добавлено к .bashrc. Но ожидайте: как это будет знать имя канала? Это может основывать имя на TTY (который может быть, знают с tty команда), с помощью простого REGEX's в sedнекоторые приемы). К чему необходимо добавить ~/.bashrc затем будет:

pipe="$(sed 's/\/dev\///' <<< `tty` | sed 's/\///')pipe"
                # ^^^- take out '/dev/' and other '/', add 'pipe'
tpr $pipe &     # start our script with the appropriate pipe name
5
27.01.2020, 20:54
  • 1
    , я обновлю это для запущения скрипта на запуске для каждого терминала как можно скорее. –  JMCF125 08.02.2014, 23:18
  • 2
    , который я рассматриваю как @Gilles отнесенный, если целевой терминал выполняет что-то (с входом, выводом и ошибками, отображенными туда), может быть проблемой. Скажите, с startx, нет просто никакого показанного вывода направленной команды; но это может быть намного хуже. Я попытаюсь адресовать к той проблеме как можно скорее. –  JMCF125 09.02.2014, 20:21
  • 3
    @ChrisDown, спасибо, теперь я зафиксировал его в своем компьютере также. Я не заметил ошибки (все еще новичок в Bash), просто разветвил его отсюда, где это неправильно первоначально. –  JMCF125 10.02.2014, 13:17
  • 4
    Это работает фантастически над ksh .profile на AIX! Это будет очень удобно в будущем. –  bgStack15 09.07.2014, 21:06

Вариант Вима. Vim должен быть редактором по умолчанию.

  1. Выберите длинную команду из истории, используя стрелки вверх/вниз. Я выбрал это:echo "один два три" > new_file.txt
  2. Нажмите комбинацию Ctrl + x Ctrl + e. Это откроет нашу длинную команду внутри Vim. Нажмите Ctrl + g, чтобы отобразить имя временного файла в нижней части окна vim. В моем случае это /tmp/bash-fc.230BC2
  3. Перейдите к другому tty, введите vim /tmp/bash-fc.230BC2 (используя автозаполнение имени файла , конечно). Он скажет вам «Файл подкачки уже существует» — нажмите O, чтобы открыть только для чтения.
  4. Затем внутри vim вам потребуется следующая последовательность клавиш: y$ : ! Ctrl+r " Введите
    Объяснение :
    • y$ - скопировать все символы строки, кроме завершающего символа новой строки.
    • : - перейти в режим командной строки
    • ! - выполнить команду через шелл
    • Ctrl+r " - вставить скопированную строку в командную строку.
    • Enter - выполнить команду

Стоит отметить, что вся эта последовательность клавиш можно сопоставить с одним нажатием клавиши, отредактировав файл .vimrc.

Готово - команда скопирована с одного tty на другой и выполнена.

0
27.01.2020, 20:54

Теги

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