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

Вопрос или проблема

В настоящее время я использую yazi как текстовый файловый менеджер, и одной из задач, которую я хотел выполнить, было настроить его в эмуляторе терминала в виде многопанельного интерфейса, чтобы файловый менеджер и командная строка были синхронизированы.

По сути, если я перехожу в новый каталог в yazi, другая панель, где запущена другая оболочка, также будет переходить в новый каталог. Если я захочу открыть файл из yazi, он откроется в другой панели/оболочке.

Я знаю, что могу записать в другую оболочку, используя что-то типа <command xyz> > /proc/<pid>/fd/1, но, похоже, это не позволяет мне действительно выполнять команды.

Я знаю, что yazi может порождать подоболочки, и я думал, что одна из возможностей — подключиться к подоболочке в другой панели, но я действительно не уверен, как подключить эмулятор терминала к существующей оболочке. Я использую WezTerm, который может выполнять мультиплексирование, но я не думаю, что это позволит мне подключиться к подоболочке, которая имеет допустимый PID и /dev/pts/<N>

Ответ или решение

Для успешного выполнения команд в одном терминале на основе действий в другом, особенно когда вы используете текстовый пользовательский интерфейс (TUI) файл-менеджера, такого как yazi, следует учитывать несколько важных аспектов командной строки и работы с терминальными процессами.

Теория

Работа с несколькими панелями в терминале требует понимания терминальных эмуляторов и API, через которые они общаются с процессами командной оболочки. Когда мы говорим о передаче команд между терминалами или панелями, критически важным становится понимание концепций PID (идентификаторов процессов) и псевдотерминалов (PTY), которые позволяют внешним программам взаимодействовать с терминальными сессиями.

Командой, записывающей выход в файл дескриптора (/proc/<pid>/fd/1), действительно можно направить результат в другой терминал, однако это недостаточно для выполнения команд — необходимо, чтобы другая оболочка активно воспринимала эту команду как ввод, а не просто как вывод. Стандартный механизм для подобных сценариев — использовать сетевой или IPC (межпроцесс-КМО) протоколы для общения между процессами. Это может включать Unix-сокеты или прямую запись в файловый дескриптор оболочки, контролируемой PTY.

Пример

Предположим, мы используем WezTerm как терминальный эмулятор с возможностями мультиплексирования и управляемой сессии. Он может создавать и управлять множеством терминальных вкладок или панелей внутри одного окна; вариативные сценарии переключения и синхронизации между меню и командной строкой могут быть достигнуты через скрипты автозапуска в оболочке или непосредственные API вызовы.

  1. Синхронизация директорий. Когда вы перемещаетесь в новый каталог в yazi, можно воспользоваться скриптом, который отправляет аналогичную команду cd <путь> в другую терминальную панель. Это возможно через межпроцессовое взаимодействие, например, использование именованных каналов (FIFO) или сокетов.

  2. Открытие файлов. Если yazi поддерживает запуск внешних команд при открытии файла, то вызов конфигурируемого скрипта, который взаимодействует с терминальной панелью, например, через сокет, для выполнения аналогичных действий в другой панели.

Применение

Во-первых, настройте ваш yazi для выполнения команд оболочки при определенных событиях:

echo 'cd $(yazi print current-path)' > /temp/sync_shell_commands

Во-вторых, настройте постоянно выполняемый скрипт в WezTerm (или в другой оболочке), читающий команды из временного файла и исполняющий их:

while true; do
  if [[ -f /temp/sync_shell_commands ]]; then
    source /temp/sync_shell_commands
    rm /temp/sync_shell_commands
  fi
  sleep 1
done

Вам необходимо:

  • Вызывать обработчик source для каждой команды, чтобы применить изменения в текущем окружении оболочки.

  • Надежно удалять или обнулять файл команд для предотвращения повторных выполнений.

Также в конфигурационном файле WezTerm можно задавать команды, которые вызываются при старте или изменении окружения, например:

return {
  shell = 'bash',
  default_prog = {"bash", "-l", "-c", "while true; do ... ; done"}
}

Так, WezTerm будет запускать вашу оболочку с постоянной проверкой предопределенного файла для выполнения.

Таким образом, можно эффективно разделять взаимодействия между yazi и другим терминалом. Понимание и применение описанных концепций позволит создать более интегрированную и практическую TUI/CLI среду, значительно улучшая опыт работы с несколькими панелями или сессиями в мощных текстовых интерфейсах.

Оцените материал
Добавить комментарий

Капча загружается...