Ответ 1
Я ответил на свой вопрос! Вы должны перенаправить вывод и вывод терминала:
#!/bin/tcsh
vi my_file < `tty` > `tty`
Я хочу, чтобы мой tcsh script запустил редактор (например, vi, emacs):
#!/bin/tcsh
vi my_file
Это запустит vi с помощью my_file, но сначала отображает предупреждение "Vim: Warning: Output is not to the terminal", и мои нажатия клавиш не отображаются на экране. После того, как я убью vi, мое оконное окно перепутано (нет новых строк), требуя "reset". Я попробовал "emacs -nw", "xemacs -nw" и pico с аналогичными результатами. "xemacs" работает, но запускает отдельное окно. Я хочу повторно использовать одно и то же окно терминала.
Есть ли способ запустить редактор из script, чтобы он повторно использовал одно и то же окно терминала?
Я ответил на свой вопрос! Вы должны перенаправить вывод и вывод терминала:
#!/bin/tcsh
vi my_file < `tty` > `tty`
Причина, по которой вы получаете сообщение об ошибке, заключается в том, что когда вы запускаете оболочку в своей среде, она начинается с подоболочки, в которой STDIN и STDOUT не связаны с TTY - вероятно, потому что это нечто похожее на конвейер. При перенаправлении вы открываете новое подключение непосредственно к устройству. Так, например, ваша командная строка включает
$ vi < `tty` > `tty`
в
$ vi < /dev/ttys000 > /dev/ttys000
Итак, вы не используете старый STDIN/STDOUT, вы создаете два новых файла и сопоставляете их с вашим процессом STDIN/STDOUT.
Теперь расскажите, что вы делаете с этим, и мы расскажем вам, как избежать этого kludge.
Я хотел сделать что-то подобное. Мне нужен псевдоним, который найдет последний файл, над которым я работал, и откройте его в vi (1) для редактирования. Во всяком случае, я не мог понять, как это сделать как читаемый псевдоним (в tcsh), поэтому я просто создал уродливую оболочку script (csh, потому что я старше):
#!/bin/csh
set DIR = "~/www/TooMuchRock/shows/"
set file = $DIR`ls -t $DIR | head -1`
set tty = `tty`
vi $file <$tty >$tty
(1) kraftwerk: bin > , который vi vi: aliased в /usr/local/bin/vim -u ~/.exrc
Задайте свой терминал tty
переменной, а затем перенаправьте ввод/вывод редактора через эту переменную.
В script:
#!/bin/sh
ls | while read a; do vi $a < $MYTTY >$MYTTY; done
И затем выполните script с помощью:
$ MYTTY=`tty` ./myscript >/tmp/log
Мне удалось получить желаемое поведение в bash + Cygwin + Terminator:
#!/bin/bash
vim foo
Запустите script, vim загружается, нет сообщений об ошибках, ведет себя как обычно. Тем не менее, есть, конечно, десятки вариантов между нашими установками, поэтому я не могу не догадываться о том, что делает разницу. Мне любопытно, что это такое, но вы получили его работу, что является важной частью.
Совершенно верно.: -)
Запишите свой script и вызовите переменную окружения EDITOR, которую вы установите на "emacsclient". Затем запустите Emacs, выполните M-x server-start
, перейдите в буфер оболочки (M-x shell
) и выполните script. Emacsclient выведет вещь, которую нужно отредактировать, и C-x #
будет действовать как команда "done" и вернет вас на ваш script с завершенными или отмененными изменениями по вашему выбору.
Enjoy.
Изменить: я хотел добавить, что в эти дни Emacs - моя терминальная программа. У меня есть десятки буферов оболочки и никогда не приходится беспокоиться о потере вывода и использовать всю мощь Emacs для управления и анализа вывода терминала. И скрипты Emacs генерируют ввод в оболочки. Ужасно. Например, просмотр вывода Tomcat прокручивается в буфере оболочки при редактировании источников или обработке почты или выполнении большинства действий Emacs очень удобно. Когда появляется трассировка стека Tomcat, я могу быстро ответить на него.
Имел те же проблемы с 'pinfo' в оболочке script 'while'. Линия может использоваться в script, она использует "ps", чтобы найти tty текущего номера процесса, "$$" и сохраняет tty в $KEY_TTY:
KEY_TTY=/dev/`ps | grep $$ | tr -s '[:blank:]' | cut -d " " -f 3`
Позже в script просто вызовите только tty-версию, с $KEY_TTY в качестве ввода, в моем случае это было:
pinfo -m $s $page < $KEY_TTY
Для 'vi' это будет:
vi $a < $KEY_TTY > $KEY_TTY
Преимущество состоит в том, что script в целом может принимать вход STDIN, а "vi" (или что-то еще) должен работать нормально - не задумываясь о необходимости устанавливать какие-либо переменные окружения перед запуском script.