проблема запуска emacs -nw при чтении команды из файла - PullRequest
1 голос
/ 09 сентября 2011

У меня есть файл, содержащий команды bash, и я читаю их одну за другой и вызываю eval для их запуска.Это работало нормально, пока я не попытался запустить "emacs -nw".Я упростил проблему в следующих случаях.Кто-нибудь может объяснить, почему команды emacs не работают и как это исправить?Я подозреваю, что это что-то с кавычками и / или дефисом, но не может выяснить проблему, и другие команды с пробелами в них работают нормально.

Рассмотрим следующие случаи:

>> cmd="emacs -nw"; echo $cmd; eval $cmd;

Это работает как ожидалось.Emacs открывается в текущей оболочке.

>> cmd="ls /tmp"; echo $cmd; eval $cmd;

Это работает как положено.Я вижу содержимое /tmp.

>> echo "emacs -nw" > /tmp/cmds; cat /tmp/cmds | 
   while read cmd; do echo $cmd; eval $cmd; done

Это не работает.Я получаю «emacs: стандартный ввод не является tty», как если бы я пытался передать ввод в emacs -nw (например, как вы grep и направить его на less).

>> echo "ls /tmp" > /tmp/cmds; cat /tmp/cmds | 
   while read cmd; do echo $cmd; eval $cmd; done

Это работает, как и ожидалось, поэтому я не думаю, что есть проблема с кавычками / пробелами.Это оставляет дефис, но если я скажу "ls -alh", это тоже хорошо работает.

Так что случилось с командой emacs?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 09 сентября 2011

Когда вы передаете какую-либо команду, вы заменяете ее стандартный ввод. Вы добавляете в while ... done, а emacs является частью этой команды, и поэтому ее стандартный ввод - это труба.

Я предполагаю, что было бы какое-то умное использование перенаправления, с помощью которого вы могли бы "сохранять" и "восстанавливать" стандартный ввод, но я не придумал это. Или вы могли бы eval $cmd </dev/tty.

1 голос
/ 09 сентября 2011

Emacs нужен tty для запуска в режиме -nw, ваша кошка | В то время как цикл чтения использует вывод cat в качестве стандартного ввода для всех дочерних команд, и это не tty. Лучше всего загрузить все строки / tmp / cmd в массив строк, а затем выполнить цикл по массиву для выполнения каждой команды (но это также может привести к сложностям с цитированием).

...