как мне запустить команду в терминале, как если бы я открыл терминал и ввел команду

#linux #bash #unix #terminal #gnome-terminal

#linux #bash #unix #терминал #gnome-терминал

Вопрос:

Я трачу много времени на открытие терминалов и ввод в них команд.

 $ gnome-terminal
(change mouse focus to new terminal)
$ reset amp;amp; clear amp;amp; tail -F ~/file_that_grows
  

время от времени я захожу в это окно и завершаю процесс с помощью control-C, а затем перезапускаю его. На самом деле я обычно использую псевдоним reset amp;amp; …. бит для чего-то более типизируемого, например rctf .

Как я могу автоматизировать первый этап процесса? Лучшее, что я могу сделать до сих пор, это

 gnome-terminal --title rctf -e 'tail -F ~/.bashrc'
  

Но с этим связаны различные проблемы. Во-первых, ~ не расширяется, поэтому файл не найден. Во-вторых, когда команда завершена, терминал завершает работу.

Есть ли какой-нибудь способ автоматически запустить терминал точно так, как если бы я открыл его, а затем что-то набрал? (Дополнительные баллы, если вы можете получить команду в истории, чтобы ее можно было перезапустить с помощью стрелки вверх ).

Ответ №1:

Если вы не возражаете против сохранения вашей команды в файле, вы можете злоупотребить этой --rcfile опцией bash . Например, используя следующий скрипт для сохранения ваших команд:

 [me@home]$ cat $HOME/.term-rcfile  
. ~/.bashrc         # chain in the standard rc file
tail -F ~/.bashrc   # command to run
  

Затем вы можете сделать:

 xterm -e "bash --rcfile $HOME/.term-rcfile -i"
  

Также должно работать для gnome-terminal:

 gnome-terminal -e "bash --rcfile $HOME/.term-rcfile -i"
  

«(Дополнительные баллы, если вы можете получить команду в истории, чтобы ее можно было перезапустить с помощью стрелки вверх )».

Я не вижу, как это сделать автоматически, но если ваш запуск:

 history -r ~/.term-rcfile
  

как только вы окажетесь в новом терминале (или когда захотите / понадобится), записи из файла будут добавлены к вашей истории (без их запуска), и тогда у вас будет доступ к ним, как к обычным записям истории.

Ответ №2:

Для интерактивных программ я использую:

     xterm -e 'sh -c "vi $HOME/foo.txt; sh"'
  

Это sh -c означает, что переменные в моей командной строке заменяются
, а sh в конце означает, что оболочка запускается после того, как я закончу
, vi вместо закрытия окна терминала.

Для такой неинтерактивной программы, tail которую можно остановить, только нажав CTRL-C для отправки SIGINT процессу, я использую trap встроенную оболочку, чтобы убедиться, что оболочка запускается, если пользователь нажимает CTRL-C вместо закрытия окна терминала:

     xterm -e sh -c 'trap sh SIGINT; tail -f $HOME/foo.txt'
  

Комментарии:

1. Это делает то, что я хочу для vi, но с tail Ctrl-C для завершения программы также убивает xterm. (используя xterm -e ‘sh -c «tail -F ~/.bashrc; sh»‘ )

Ответ №3:

Используйте переменную $HOME вместо тильды.

 gnome-terminal --title rctf -e "tail -F $HOME/.bashrc"
  

Комментарии:

1. Давно, но все еще интересно. Я хочу открыть gnome-terminal после установки специального USB-устройства. Я экспортировал отображение в свой sh-файл, который вызывается из правила udev, и в нем я выдаю gnome-terminal. Но я хочу, чтобы это был единственный скрипт, печатающий некоторую информацию на новом терминале и ожидающий ввода пользователем путем чтения. Интерактивный. Это работает, когда я запускаю gnome-terminal без аргументов, передача title ничего не делает, x и e просто немедленно закрывают окно. Что может быть правильным способом?