Я часто открываю два или три окна терминала MacOS в мозаичной конфигурации. Иногда я хочу cd в определенный каталог в каждом из них.

Лучше всего попытаться написать в /dev/ttys00* , например,

echo -ne "echo hello\x0a\x0d" > /dev/ttys000

Это будет отображаться на другом терминале, но байты в конце не запускают команду, которая будет принята. Есть ли последовательность байтов, которая делает это? (Меня не удивит, если нет, по соображениям безопасности.) Кстати, вы можете запустить tty чтобы узнать, на каком устройстве отображается конкретное окно.

Я также попытался установить переменную $PWD но она, похоже, не меняет каталог.

1 ответ1

1

Это будет отображаться на другом терминале, но байты в конце не запускают команду, которая будет принята.

Каждое устройство tty имеет два конца, как труба. То, что вы пишете в один конец , не возвращается назад, а выходит через другой конец. Например, с последовательными портами у вас есть /dev/ttyS* на одном конце, а физический последовательный порт на другом конце. То, что вы пишете в /dev/ttyS0 , отправляется по проводам.

Аналогично, для псевдотерминалов (ptys) у вас /dev/ttys* происходит переход к безымянному устройству "pty master", которым управляет приложение терминала. Когда вы записываете что-то в /dev/ttys000 , оно вообще не принимается оболочкой как входные данные, потому что оболочка прикреплена к той же "ведомой" стороне pty. Вместо этого запись принимается терминальным приложением, которое содержит соответствующий pty master 'fd, и отображается так, как если бы это был программный вывод.

(Некоторые старые BSD, где ptys называются /dev/ttyP* , имеют соответствующее устройство /dev/ptyP* для мастер-конца, но я не думаю, что у macOS есть аналог. Linux, конечно, нет - каждый раз, когда вы открываете /dev/ptmx там, вы получаете новую выделенную пару pty.)


Так как добиться того, что вы хотите?

  • Вы можете попытаться найти escape-последовательность, которая просит терминал вернуть что-то обратно в качестве ввода. Раньше это существовало (например, существовала последовательность "скажи мне текущее название окна"), но почти все терминалы отключают ее по соображениям безопасности: например, если вы cat вредоносный файл, он может установить заголовок терминала и немедленно запросить это обратно, таким образом, запустив команду.

  • Вы можете попросить ядро подделать ввод. В Linux есть ioctl(TIOCSTI) который может использоваться такими инструментами, как writevt ; это петля обратно на вход для всех других программ , подключенных к одному концу терминала. Я не уверен, работает ли это на macOS.

  • Вы можете посмотреть на другие методы автоматизации. Если я правильно помню, у macOS есть приложение "Automator" и AppleScript. Другие системы могут иметь инструменты, которые подключаются к функциям специальных возможностей (как виртуальная клавиатура).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .