Подтвердить что ты не робот

Как запустить редактор из оболочки script?

Я хочу, чтобы мой 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, чтобы он повторно использовал одно и то же окно терминала?

4b9b3361

Ответ 1

Я ответил на свой вопрос! Вы должны перенаправить вывод и вывод терминала:

#!/bin/tcsh
vi my_file < `tty` > `tty`

Ответ 2

Причина, по которой вы получаете сообщение об ошибке, заключается в том, что когда вы запускаете оболочку в своей среде, она начинается с подоболочки, в которой STDIN и STDOUT не связаны с TTY - вероятно, потому что это нечто похожее на конвейер. При перенаправлении вы открываете новое подключение непосредственно к устройству. Так, например, ваша командная строка включает

$ vi < `tty` > `tty`

в

$ vi < /dev/ttys000 > /dev/ttys000

Итак, вы не используете старый STDIN/STDOUT, вы создаете два новых файла и сопоставляете их с вашим процессом STDIN/STDOUT.

Теперь расскажите, что вы делаете с этим, и мы расскажем вам, как избежать этого kludge.

Ответ 3

Я хотел сделать что-то подобное. Мне нужен псевдоним, который найдет последний файл, над которым я работал, и откройте его в 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

Ответ 4

Задайте свой терминал tty переменной, а затем перенаправьте ввод/вывод редактора через эту переменную.

В script:

#!/bin/sh

ls | while read a; do vi $a < $MYTTY >$MYTTY; done

И затем выполните script с помощью:

$ MYTTY=`tty` ./myscript >/tmp/log

Ответ 5

Мне удалось получить желаемое поведение в bash + Cygwin + Terminator:

#!/bin/bash
vim foo

Запустите script, vim загружается, нет сообщений об ошибках, ведет себя как обычно. Тем не менее, есть, конечно, десятки вариантов между нашими установками, поэтому я не могу не догадываться о том, что делает разницу. Мне любопытно, что это такое, но вы получили его работу, что является важной частью.

Ответ 6

Совершенно верно.: -)

Запишите свой script и вызовите переменную окружения EDITOR, которую вы установите на "emacsclient". Затем запустите Emacs, выполните M-x server-start, перейдите в буфер оболочки (M-x shell) и выполните script. Emacsclient выведет вещь, которую нужно отредактировать, и C-x # будет действовать как команда "done" и вернет вас на ваш script с завершенными или отмененными изменениями по вашему выбору.

Enjoy.

Изменить: я хотел добавить, что в эти дни Emacs - моя терминальная программа. У меня есть десятки буферов оболочки и никогда не приходится беспокоиться о потере вывода и использовать всю мощь Emacs для управления и анализа вывода терминала. И скрипты Emacs генерируют ввод в оболочки. Ужасно. Например, просмотр вывода Tomcat прокручивается в буфере оболочки при редактировании источников или обработке почты или выполнении большинства действий Emacs очень удобно. Когда появляется трассировка стека Tomcat, я могу быстро ответить на него.

Ответ 7

Имел те же проблемы с '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.