Как заменить программу, запущенную в графическом терминале, другой программой?

Несмотря на то, что сейчас ваш проект может состоять исключительно из 50 сценариев Bash, рано или поздно он начнет накапливать сценарии, написанные на других языках, таких как Perl или Python (, благодаря преимуществам этих языков сценариев, которых нет у Bash. ).

Без надлежащей#!-строки в каждом скрипте было бы крайне сложно использовать различные скрипты, не зная также, какой интерпретатор использовать. Неважно, выполняется ли каждый отдельный скрипт из других скриптов , это только переносит трудности с конечных пользователей на разработчиков. Ни одной из этих двух групп людей не нужно знать, на каком языке написан сценарий, чтобы иметь возможность его использовать.

Сценарии оболочки, выполняемые без строки#!-и без явного интерпретатора, выполняются по-разному в зависимости от того, какая оболочка их вызывает (, см., например,. вопрос Какой интерпретатор оболочки запускает скрипт без шебанга? и особенно ответ Стефана ), а это не то, что вам нужно в производственной среде (, вам нужно согласованное поведение и, возможно, даже переносимость ).

Скрипты, выполняемые явным интерпретатором, будут выполняться этим интерпретатором независимо от того, что написано в строке #!-. Это вызовет проблемы в дальнейшем, если вы решите повторно -реализовать, скажем, сценарий Bash на Python или любом другом языке.

Вы должны потратить эти дополнительные нажатия клавиш и всегда добавлять строку#!-к каждому сценарию.


В некоторых средах в каждом скрипте каждого проекта есть шаблонные юридические тексты, состоящие из нескольких -абзацев. Будьте очень счастливы, что только строка#!-кажется «лишней» в вашем проекте.

0
16.02.2020, 21:56
2 ответа

Насколько мне известно, универсального решения для этого нет. Клиент tmux работает в pty, который принадлежит терминалу gnome -, вы не можете изменить терминал pty gnome -, с которым разговаривает, или изменить программу, к которой принадлежит pty (, будь то ведущий или подчиненный конец )без участия терминала gnome -или без какого-либо серьезного кода (например, см. Reptyr, который делает обратное тому, что вы хотите -перемещает программу в другой pty, а не pty в другую программу ).

В частности, для tmux, если ваш tmux достаточно новый (2.4 или новее )вы можете использовать detach-client -Eдля замены работающего клиента tmux другим процессом -это может быть, например, другой клиент tmux:

tmux -Lfirstsocket detach -E 'tmux -Lsecondsocket attach'

Если ваш tmux недостаточно новый, ваши возможности, вероятно, ограничены:

  • откройте новую вкладку в терминале gnome -с новым клиентом tmux и закройте исходную вкладку;

  • полностью закройте свой терминал gnome -и откройте другой с нужной программой;

  • откройте новый tmux внутри старого tmux, а затем скройте строку состояния и отключите префикс в старом tmux, чтобы он все еще работал, но не мешал.

1
28.04.2021, 23:23

Проблема с эмуляторами терминала заключается в том, что они закрываются, когда завершается созданный ими исполняемый файл. Но вы можете запустить небольшую оболочку внутри эмулятора терминала, которая:

  1. Получение команды из сокета UNIX,
  2. Выполнить,
  3. Завершить команду при поступлении нового сообщения.
  4. Перейти к 1.

Примерно так суть . Вы сохраняете файлы в каталоге, можете скомпилировать сервер с:

gcc -Wall -o server libwrapper.c server.c

и клиент с:

gcc -Wall -o client libwrapper.c client.c

Вы запускаете сервер в одном терминале:

./server

и переключать команды через клиент в другой:

./client /bin/cat /etc/motd
1
28.04.2021, 23:23

Теги

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