Я часто вызываю команды из Emacs, например aptitude update
. Решение scottfrazer может быть не таким полезным. Синхронные команды заставляют меня долго ждать, и если вы запустите неподдерживаемую программу (например, aptitude
, которая использует ncurses ), вы повесите Emacs ( Cg won не поможет), а загрузка процессора составит 100%. Изменение на async-shell-command
решает эту проблему.
Но это также создает новую проблему. Если ваша команда не выполнена, ваш пароль окажется в буфере *Messages*
:
echo PASSWORD | sudo -S aptitude: exited abnormally with code 1.
Вот почему я предлагаю следующее решение:
(defun sudo-shell-command (command)
(interactive "MShell command (root): ")
(with-temp-buffer
(cd "/sudo::/")
(async-shell-command command)))
Здесь "M" в interactive
запрашивает имя программы в минибуфере, with-temp-buffer
создает поддельный буфер, в котором мы меняем каталог на /sudo::/
, чтобы использовать TRAMP для приглашения sudo.
Это решение Дэвида Каструпа из команды sudo с подсказкой пароля минибуфера @ gnu.emacs.help .
Обратите внимание, что вы все равно не должны вызывать aptitude
напрямую, иначе подпроцесс будет там всегда, пока вы не отправите sudo pkill aptitude
.
Читайте оболочки и процессы в ручном режиме.