Как запустить терминал с определенным текстом, уже введенным в командной строке?

Вместо того, чтобы перефразировать мой вопрос, позвольте мне описать вам желаемый пользовательский случай:

Я создаю короткий shell-скрипт для запуска команды "gnome-terminal --someoptionflagname" мой текст для публикации " "и выполните этот скрипт.

Появляется Gnome-терминал с подсказкой командной строки, за которой следует мой текст.

То есть: fields@mycomputer:/$ my text to be posted

Можно ли это сделать?

25
задан 8 October 2010 в 21:39

7 ответов

Два ответа, которые мне больше всего понравились, - это использовать expect и , этот , где они рекомендуют использовать флаг --init-file либо в шебанге, либо при выполнении терминала:

#!/bin/bash --init-file
commands to run

... и выполнить его как:

xterm -e /path/to/script
# or
gnome-terminal -e /path/to/script
# or
the-terminal -e bash --init-file /path/to/script/with/no/shebang

expect, вероятно, лучшее решение (по причинам, которые я обрисую), за исключением того, что я не могу контролировать, установлено ли оно в моем целевая среда.

Проблема, с которой я столкнулся с bash --init-file и gnome-terminal --command в качестве хака для решения этой проблемы, заключается в том, что оболочка не имеет доступа к STDIN при выполнении сценариев инициализации. Если, например, я хочу запустить что-то, что потребует ввода данных пользователем (ftp, telnet и т. Д.), Но потом оставить родительскую оболочку включенной, это не сработает; единственное исключение, которое я видел до сих пор, это ssh:

xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')

... но что мне нужно, сложнее, чем этот пример с игрушкой. В любом случае, я надеюсь, что материал --init-file будет полезен всем, кто читает этот вопрос.

0
ответ дан 8 October 2010 в 21:39

Предложение Эндрюка очень хорошо и работает для меня, однако команда жестко запрограммирована в скрипте, и если вы измените размер окна терминала, он не будет работать хорошо. Используя его код в качестве основы, я добавил возможность посылать сценарию myprompt команду в качестве аргумента, и этот скрипт правильно обрабатывает изменение размера окна терминала.

#!/usr/bin/expect

#trap sigwinch and pass it to the child we spawned
#this allows the gnome-terminal window to be resized
trap {
 set rows [stty rows]
 set cols [stty columns]
 stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH

set arg1 [lindex $argv 0]

# Get a Bash shell
spawn -noecho bash

# Wait for a prompt
expect "$ "

# Type something
send $arg1

# Hand over control to the user
interact

exit

и запустите Терминал Gnome с:

gnome-terminal -e "~/bin/myprompt \"my text to be posted\""
0
ответ дан 8 October 2010 в 21:39

Вы можете сделать это с ожидайте ( установить ). Создайте и сделайте исполняемый файл ~/bin/myprompt:

#!/usr/bin/expect -f

# Get a Bash shell
spawn -noecho bash

# Wait for a prompt
expect "$ "

# Type something
send "my text to be posted"

# Hand over control to the user
interact

exit

и запустите Gnome Terminal с:

gnome-terminal -e ~/bin/myprompt
0
ответ дан 8 October 2010 в 21:39

Ответ Ундрука хорош, но, возможно, немного тяжеловес для этой задачи.

Вот скрипт, который пишет скрипт на основе своих аргументов.

#!/bin/sh
# terminal-plus-command: start a subordinate terminal which runs
# the interactive shell after first running the command arguments

tmpscript=/tmp/tmpscript.$
echo "#!$SHELL" > $tmpscript
echo "$@" >> $tmpscript
echo exec "$SHELL" >> $tmpscript
chmod +x $tmpscript
gnome-terminal --command $tmpscript
rm -f $tmpscript

Если вы не занимались программированием оболочки, здесь, похоже, больше магии, чем есть. Сначала я назову временный файл для хранения скрипта, где $ - это идентификатор процесса оболочки, выполняющей этот скрипт. Метафора /tmp/something.$ используется в случае, если два экземпляра этого скрипта выполняются одновременно, они не будут пытаться использовать один и тот же временный файл.

Переменная $SHELL установлена ​​на имя оболочки, в которой выполняется скрипт. Если вы используете / usr / bin / bash, возможно, вы захотите использовать его и в мини-скрипте.

"$@" является идиомой оболочки для «интерполировать все мои аргументы, цитируя их при необходимости». Этот специфический синтаксис заставляет

script.sh 'my file' your\ file

интерполировать аргументы как два элемента

"my file" "your file"

вместо четырех, которые $@ будут давать

"my" "file" "your" "file"

Последний В строках сценария gnome-терминал запускает мини-сценарий, а затем запускает интерактивную оболочку. Когда gnome-терминал завершает работу, временный скрипт удаляется, потому что мусор не охлаждается.

Последняя строка не является частью мини-скрипта, она показывает, что мини-скрипт работает. Если приведенный выше 11-строчный скрипт находится в файле с именем rt.sh, то chmod делает его исполняемым, а затем выполняется.

$ chmod +x rt.sh && ./rt.sh echo hello world

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

hello world

в первой строке и затем запускает интерактивную оболочку:

msw@myhost:~$
0
ответ дан 8 October 2010 в 21:39

Вы можете использовать аргументы -e или -x для запуска команды внутри недавно запущенного терминала, но это не совсем то, что вам нужно.

0
ответ дан 8 October 2010 в 21:39

Если я правильно понимаю, вы хотите, чтобы ваша первая строка ввода была предварительно заполнена содержимым, которое вы передаете в командной строке gnome-терминала.

Я не знаю, как именно это сделать с помощью bash, но вот кое-что, что близко. В вашем ~/.bashrc добавьте следующую строку в самом конце:

history -s "$BASH_INITIAL_COMMAND"

Запустите gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash и нажмите Up в приглашении, чтобы вызвать текст.

Также обратите внимание, что если вы поставите set -o history с последующими комментариями в конце вашего .bashrc, они будут внесены в историю при запуске bash, так что вы можете использовать их в качестве основы для редактирования, достигнув их с помощью Up и удаление начальных #.

0
ответ дан 8 October 2010 в 21:39

Чтобы запустить интерактивный bash внутри gnome-терминала с уже выполненными некоторыми командами, я помещаю эти команды в установочный файл и динамически добавляю содержимое в мой файл .bashrc:

# my_startup_script.sh
export FOO=bar
echo "hello world"
gnome-terminal --tab -- bash -c "bash --rcfile <(cat ${HOME}/.bashrc my_startup_script.sh; )"
=> 
hello world
$ echo $FOO
bar
0
ответ дан 18 September 2020 в 18:50

Другие вопросы по тегам:

Похожие вопросы: