Вместо того, чтобы перефразировать мой вопрос, позвольте мне описать вам желаемый случай пользователя:
Я создаю короткий shell-скрипт для запуска команды «gnome-terminal --someoptionflagname» мой текст, который будет опубликован '"и выполнить этот скрипт.
Выходит Gnome-терминал, с приглашением командной строки, за которым следует мой текст.
ie: fields@mycomputer:/$ my text to be posted
Можно ли это сделать?
Вы можете сделать это с помощью функции expect (install). Создайте и создайте исполняемый файл ~/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 с помощью:
gnome-terminal -e ~/bin/myprompt
Вы можете сделать это с помощью функции expect (install). Создайте и создайте исполняемый файл ~/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 с помощью:
gnome-terminal -e ~/bin/myprompt
Вы можете сделать это с помощью функции expect (install). Создайте и создайте исполняемый файл ~/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 с помощью:
gnome-terminal -e ~/bin/myprompt
Вы можете сделать это с помощью функции expect (install). Создайте и создайте исполняемый файл ~/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 с помощью:
gnome-terminal -e ~/bin/myprompt
Вы можете сделать это с помощью ожидать ( установить ). Создайте и создайте исполняемый файл ~ / bin / myprompt
:
#! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из
и запустите терминал Gnome с помощью:
gnome-terminal -e ~ / bin / myprompt
Вы можете сделать это с помощью ожидать ( установить ). Создайте и создайте исполняемый файл ~ / bin / myprompt
:
#! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из
и запустите терминал Gnome с помощью:
gnome-terminal -e ~ / bin / myprompt
Вы можете сделать это с помощью ожидать ( установить ). Создайте и создайте исполняемый файл ~ / bin / myprompt
:
#! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из
и запустите терминал Gnome с помощью:
gnome-terminal -e ~ / bin / myprompt
Вы можете сделать это с помощью ожидать ( установить ). Создайте и создайте исполняемый файл ~ / bin / myprompt
:
#! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из
и запустите терминал Gnome с помощью:
gnome-terminal -e ~ / bin / myprompt
Вы можете сделать это с помощью ожидать ( установить ). Создайте и создайте исполняемый файл ~ / bin / myprompt
:
#! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из
и запустите терминал Gnome с помощью:
gnome-terminal -e ~ / bin / myprompt
Вы можете сделать это с помощью ожидать ( установить ). Создайте и создайте исполняемый файл ~ / bin / myprompt
:
#! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из
и запустите терминал Gnome с помощью:
gnome-terminal -e ~ / bin / myprompt
Если я правильно понимаю, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке gnome-terminal.
Я не знаю, как это сделать с помощью bash, но вот что-то, что приближается. В ~/.bashrc добавьте следующую строку в конец:
history -s "$BASH_INITIAL_COMMAND"
Запустите gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash и нажмите «Вверх» в строке, чтобы вызвать текст.
Примечание. что если вы поместите set -o history, а затем комментарии в конце вашего .bashrc, они войдут в историю, когда начнется bash, поэтому вы можете использовать их в качестве основы для редактирования, достигнув их с помощью Up [ ! d3] и удаление начального #.
Предложение ændrük очень хорошее и работает для меня, однако команда жестко закодирована в скрипте, и если вы измените размер окна терминала, это не сработает. Используя его код в качестве базы, я добавил возможность отправить скрипт 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\""
Ответ ændrük в порядке, но, возможно, маленький тяжеловес для задачи.
Вот скрипт, который пишет скрипт на основе его аргументов
#!/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"
[d7 ] В последних строках сценария устроен гном-терминал для запуска мини-скрипта, а затем запускается интерактивная оболочка. Когда терминал gnome завершает работу, временный скрипт удаляется, потому что мусор нераскрывается. Последняя строка не является частью мини-скрипта, она демонстрирует, что работает мини-скрипт. Если 11-строчный скрипт выше находится в файле с именем rt.sh, то chmod делает его исполняемым, а затем он выполняется.
$ chmod +x rt.sh && ./rt.sh echo hello world
Результатом всего этого будет гном-терминал, который запускается, отображает
hello world
в своей первой строке и затем запускает интерактивную оболочку:
msw@myhost:~$
Два ответа, которые мне наиболее понравились, это использовать expect и этот, где они рекомендуют использовать флаг --init-file либо в shebang, либо при выполнении терминала:
#!/bin/bash --init-file
commands to run
[d2 ] ... и выполнить его как: 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, вероятно, лучшее решение (по причинам, которые я опишу), за исключением того, что я не могу контролировать, установлено ли это в моей целевой среде. [ ! d3]
Проблема, с которой я столкнулся с --init-file и gnome-terminal [bash] bash gnome-terminal в качестве взлома, чтобы решить эту проблему, не имеет доступа к STDIN при выполнении сценариев инициализации. Если, например, я хочу запустить что-то, что потребует ввода пользователя (ftp, telnet и т. Д.), Но оставить родительскую оболочку запущенной позже, это не сработает; Единственное исключение, которое я видел до сих пор, это ssh:
xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')
... но то, что мне нужно, сложнее, чем этот пример игрушек. Во всяком случае, я надеюсь, что материал --init-file полезен для всех, кто читает этот вопрос.
Вы можете использовать аргументы -e или -x для запуска команды во вновь всплывающем терминале, но это не совсем то, что вы хотите.
Два ответа, которые мне наиболее понравились, это использовать expect и этот, где они рекомендуют использовать флаг --init-file либо в shebang, либо при выполнении терминала:
#!/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, вероятно, лучшее решение (по причинам, которые я опишу), за исключением того, что я не могу контролировать, установлено ли это в моей целевой среде. [ ! d3]
Проблема, с которой я столкнулся с --init-file и gnome-terminal [bash] bash gnome-terminal в качестве взлома, чтобы решить эту проблему, не имеет доступа к STDIN при выполнении сценариев инициализации. Если, например, я хочу запустить что-то, что потребует ввода пользователя (ftp, telnet и т. Д.), Но оставить родительскую оболочку запущенной позже, это не сработает; Единственное исключение, которое я видел до сих пор, это ssh:
xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')
... но то, что мне нужно, сложнее, чем этот пример игрушек. Во всяком случае, я надеюсь, что материал --init-file полезен для всех, кто читает этот вопрос.
Если я правильно понимаю, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке gnome-terminal.
Я не знаю, как это сделать с помощью bash, но вот что-то, что приближается. В ~/.bashrc добавьте следующую строку в конец:
history -s "$BASH_INITIAL_COMMAND"
Запустите gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash и нажмите «Вверх» в строке, чтобы вызвать текст.
Примечание. что если вы поместите set -o history, а затем комментарии в конце вашего .bashrc, они войдут в историю, когда начнется bash, поэтому вы можете использовать их в качестве основы для редактирования, достигнув их с помощью Up [ ! d3] и удаление начального #.
Предложение ændrük очень хорошее и работает для меня, однако команда жестко закодирована в скрипте, и если вы измените размер окна терминала, это не сработает. Используя его код в качестве базы, я добавил возможность отправить скрипт 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\""
Вы можете использовать аргументы -e или -x для запуска команды во вновь всплывающем терминале, но это не совсем то, что вы хотите.
Ответ ændrük в порядке, но, возможно, маленький тяжеловес для задачи.
Вот скрипт, который пишет скрипт на основе его аргументов
#!/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 завершает работу, временный скрипт удаляется, потому что мусор нераскрывается.
Последняя строка не является частью мини-скрипта, она демонстрирует, что работает мини-скрипт. Если 11-строчный скрипт выше находится в файле с именем rt.sh, то chmod делает его исполняемым, а затем он выполняется.
$ chmod +x rt.sh && ./rt.sh echo hello world
Результатом всего этого будет гном-терминал, который запускается, отображает
hello world
в своей первой строке и затем запускает интерактивную оболочку:
msw@myhost:~$
Два ответа, которые мне наиболее понравились, это использовать expect и этот, где они рекомендуют использовать флаг --init-file либо в shebang, либо при выполнении терминала:
#!/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, вероятно, лучшее решение (по причинам, которые я опишу), за исключением того, что я не могу контролировать, установлено ли это в моей целевой среде. [ ! d3]
Проблема, с которой я столкнулся с --init-file и gnome-terminal [bash] bash gnome-terminal в качестве взлома, чтобы решить эту проблему, не имеет доступа к STDIN при выполнении сценариев инициализации. Если, например, я хочу запустить что-то, что потребует ввода пользователя (ftp, telnet и т. Д.), Но оставить родительскую оболочку запущенной позже, это не сработает; Единственное исключение, которое я видел до сих пор, это ssh:
xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')
... но то, что мне нужно, сложнее, чем этот пример игрушек. Во всяком случае, я надеюсь, что материал --init-file полезен для всех, кто читает этот вопрос.
Если я правильно понимаю, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке gnome-terminal.
Я не знаю, как это сделать с помощью bash, но вот что-то, что приближается. В ~/.bashrc добавьте следующую строку в конец:
history -s "$BASH_INITIAL_COMMAND"
Запустите gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash и нажмите «Вверх» в строке, чтобы вызвать текст.
Примечание. что если вы поместите set -o history, а затем комментарии в конце вашего .bashrc, они войдут в историю, когда начнется bash, поэтому вы можете использовать их в качестве основы для редактирования, достигнув их с помощью Up [ ! d3] и удаление начального #.
Предложение ændrük очень хорошее и работает для меня, однако команда жестко закодирована в скрипте, и если вы измените размер окна терминала, это не сработает. Используя его код в качестве базы, я добавил возможность отправить скрипт 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\""
Вы можете использовать аргументы -e или -x для запуска команды во вновь всплывающем терминале, но это не совсем то, что вы хотите.
Ответ ændrük в порядке, но, возможно, маленький тяжеловес для задачи.
Вот скрипт, который пишет скрипт на основе его аргументов
#!/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 завершает работу, временный скрипт удаляется, потому что мусор нераскрывается.
Последняя строка не является частью мини-скрипта, она демонстрирует, что работает мини-скрипт. Если 11-строчный скрипт выше находится в файле с именем rt.sh, то chmod делает его исполняемым, а затем он выполняется.
$ chmod +x rt.sh && ./rt.sh echo hello world
Результатом всего этого будет гном-терминал, который запускается, отображает
hello world
в своей первой строке и затем запускает интерактивную оболочку:
msw@myhost:~$
Два ответа, которые мне наиболее понравились, это использовать expect и этот, где они рекомендуют использовать флаг --init-file либо в shebang, либо при выполнении терминала:
#!/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, вероятно, лучшее решение (по причинам, которые я опишу), за исключением того, что я не могу контролировать, установлено ли это в моей целевой среде. [ ! d3]
Проблема, с которой я столкнулся с --init-file и gnome-terminal [bash] bash gnome-terminal в качестве взлома, чтобы решить эту проблему, не имеет доступа к STDIN при выполнении сценариев инициализации. Если, например, я хочу запустить что-то, что потребует ввода пользователя (ftp, telnet и т. Д.), Но оставить родительскую оболочку запущенной позже, это не сработает; Единственное исключение, которое я видел до сих пор, это ssh:
xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')
... но то, что мне нужно, сложнее, чем этот пример игрушек. Во всяком случае, я надеюсь, что материал --init-file полезен для всех, кто читает этот вопрос.
Если я правильно понимаю, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке gnome-terminal.
Я не знаю, как это сделать с помощью bash, но вот что-то, что приближается. В ~/.bashrc добавьте следующую строку в конец:
history -s "$BASH_INITIAL_COMMAND"
Запустите gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash и нажмите «Вверх» в строке, чтобы вызвать текст.
Примечание. что если вы поместите set -o history, а затем комментарии в конце вашего .bashrc, они войдут в историю, когда начнется bash, поэтому вы можете использовать их в качестве основы для редактирования, достигнув их с помощью Up [ ! d3] и удаление начального #.
Предложение ændrük очень хорошее и работает для меня, однако команда жестко закодирована в скрипте, и если вы измените размер окна терминала, это не сработает. Используя его код в качестве базы, я добавил возможность отправить скрипт 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\""
Вы можете использовать аргументы -e или -x для запуска команды во вновь всплывающем терминале, но это не совсем то, что вы хотите.
Ответ ændrük в порядке, но, возможно, маленький тяжеловес для задачи.
Вот скрипт, который пишет скрипт на основе его аргументов
#!/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 завершает работу, временный скрипт удаляется, потому что мусор нераскрывается.
Последняя строка не является частью мини-скрипта, она демонстрирует, что работает мини-скрипт. Если 11-строчный скрипт выше находится в файле с именем rt.sh, то chmod делает его исполняемым, а затем он выполняется.
$ chmod +x rt.sh && ./rt.sh echo hello world
Результатом всего этого будет гном-терминал, который запускается, отображает
hello world
в своей первой строке и затем запускает интерактивную оболочку:
msw@myhost:~$