Вопрос или проблема
В настоящее время я использую 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 вызовы.
-
Синхронизация директорий. Когда вы перемещаетесь в новый каталог в
yazi
, можно воспользоваться скриптом, который отправляет аналогичную командуcd <путь>
в другую терминальную панель. Это возможно через межпроцессовое взаимодействие, например, использование именованных каналов (FIFO) или сокетов. -
Открытие файлов. Если
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 среду, значительно улучшая опыт работы с несколькими панелями или сессиями в мощных текстовых интерфейсах.