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

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

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

Выходит Gnome-терминал, с приглашением командной строки, за которым следует мой текст.

ie: fields@mycomputer:/$ my text to be posted

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

22
задан 8 October 2010 в 22:39

60 ответов

Вы можете сделать это с помощью функции 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
29
ответ дан 26 May 2018 в 01:12
  • 1
    +1 для использования Expect. Я использовал это в течение многих лет, чтобы помочь автоматизировать много вещей. – Marco Ceppi♦ 9 October 2010 в 05:42
  • 2
    Это здорово. Я надеялся, что будет простой (ish) ответ, основанный на функциональности gnome-terminal по умолчанию, но похоже, что это отвечает на задание. – emf 10 October 2010 в 07:38
  • 3
    Меня это так долго раздражало, я почти не мог вспомнить, что такое предполагаемый случай использования. Итак, для пояснения: я хотел бы сделать что-то вроде «gnome-terminal -e ls», но уловка должна открыть окно. Таким образом, в основном ярлыки для открытия терминала и запуска команд оболочки. Проясняет ли это вопросы по сравнению с ответами aendruk / msw? – emf 10 October 2010 в 07:47
  • 4
    Если вы хотите, чтобы терминал оставался открытым после команды, есть гораздо более простые решения . – ændrük 10 October 2010 в 08:21
  • 5
    Супер, спасибо. Я успешно интегрировал это в сценарий оболочки, который вызывает вызов инструмента интеграции данных Pentaho. Затем я добавил вызов этого скрипта в Unity launcher в 11.10, и он работает как шарм. – bioShark 2 December 2011 в 08:17

Вы можете сделать это с помощью функции 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
30
ответ дан 25 July 2018 в 23:08

Вы можете сделать это с помощью функции 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
30
ответ дан 27 July 2018 в 03:01

Вы можете сделать это с помощью функции 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
30
ответ дан 31 July 2018 в 11:37

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

  #! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока  prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из  

и запустите терминал Gnome с помощью:

  gnome-terminal -e ~ / bin / myprompt  
30
ответ дан 2 August 2018 в 04:28

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

  #! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока  prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из  

и запустите терминал Gnome с помощью:

  gnome-terminal -e ~ / bin / myprompt  
30
ответ дан 4 August 2018 в 21:01

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

  #! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока  prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из  

и запустите терминал Gnome с помощью:

  gnome-terminal -e ~ / bin / myprompt  
30
ответ дан 6 August 2018 в 04:33

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

  #! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока  prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из  

и запустите терминал Gnome с помощью:

  gnome-terminal -e ~ / bin / myprompt  
30
ответ дан 7 August 2018 в 22:42

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

  #! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока  prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из  

и запустите терминал Gnome с помощью:

  gnome-terminal -e ~ / bin / myprompt  
30
ответ дан 10 August 2018 в 10:48

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

  #! / Usr / bin / expect -f # Получите оболочку оболочки Bash -noecho bash # Подождите, пока  prompt ожидать «$» # Введите что-то, отправьте «мой текст, который будет опубликован» # Передайте управление пользователю, выйдите из  

и запустите терминал Gnome с помощью:

  gnome-terminal -e ~ / bin / myprompt  
30
ответ дан 13 August 2018 в 17:22
  • 1
    +1 для использования Expect. Я использовал это в течение многих лет, чтобы помочь автоматизировать много вещей. – Marco Ceppi♦ 9 October 2010 в 05:42
  • 2
    Это здорово. Я надеялся, что будет простой (ish) ответ, основанный на функциональности gnome-terminal по умолчанию, но похоже, что это отвечает на задание. – emf 10 October 2010 в 07:38
  • 3
    Меня это так долго раздражало, я почти не мог вспомнить, что такое предполагаемый случай использования. Итак, для пояснения: я хотел бы сделать что-то вроде «gnome-terminal -e ls», но уловка должна открыть окно. Таким образом, в основном ярлыки для открытия терминала и запуска команд оболочки. Проясняет ли это вопросы по сравнению с ответами aendruk / msw? – emf 10 October 2010 в 07:47
  • 4
    Если вы хотите, чтобы терминал оставался открытым после команды, есть гораздо более простые решения . – ændrük 10 October 2010 в 08:21
  • 5
    Супер, спасибо. Я успешно интегрировал это в сценарий оболочки, который вызывает вызов инструмента интеграции данных Pentaho. Затем я добавил вызов этого скрипта в Unity launcher в 11.10, и он работает как шарм. – bioShark 2 December 2011 в 08:17

Если я правильно понимаю, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке 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] и удаление начального #.

8
ответ дан 26 May 2018 в 01:12
  • 1
    Хотя это не совсем то решение, которое я искал, это интересно само по себе. – emf 10 October 2010 в 07:39

Предложение æ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\""
8
ответ дан 26 May 2018 в 01:12

Ответ æ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:~$
1
ответ дан 26 May 2018 в 01:12
  • 1
    Я думаю, что ваш скрипт может быть сведен к gnome-terminal -x sh -c "echo hello world; bash", и я не думаю, что этот вопрос требует. – ændrük 10 October 2010 в 03:13
  • 2
    Это выглядит круто. Можете ли вы объяснить, что здесь происходит? – emf 10 October 2010 в 07:38
  • 3
    e.m.fields: Я аннотировал его для вас. – msw 10 October 2010 в 09:35
  • 4
    ты жжешь. спасибо за аннотации, такая помощь делает барьер для входа со скриптами гораздо более доступным – emf 11 October 2010 в 09:41

Два ответа, которые мне наиболее понравились, это использовать 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 полезен для всех, кто читает этот вопрос.

0
ответ дан 26 May 2018 в 01:12

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

-1
ответ дан 26 May 2018 в 01:12
  • 1
    близко, но не совсем то, что я ищу. Одна из проблем заключается в том, что при выполнении и завершении терминал немедленно закрывается. Итак, предположим, что мне нужен ярлык для «ls ~ / notes», он закрывается, прежде чем я смогу просмотреть вывод. – emf 10 October 2010 в 07:41
  • 2
    Если бы было решение этого, это решило бы большинство случаев, которые я ищу. – emf 10 October 2010 в 07:42

Два ответа, которые мне наиболее понравились, это использовать 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 полезен для всех, кто читает этот вопрос.

0
ответ дан 25 July 2018 в 23:08

Если я правильно понимаю, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке 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] и удаление начального #.

8
ответ дан 25 July 2018 в 23:08
  • 1
    Хотя это не совсем то решение, которое я искал, это интересно само по себе. – emf 10 October 2010 в 07:39

Предложение æ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\""
8
ответ дан 25 July 2018 в 23:08

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

-1
ответ дан 25 July 2018 в 23:08
  • 1
    близко, но не совсем то, что я ищу. Одна из проблем заключается в том, что при выполнении и завершении терминал немедленно закрывается. Итак, предположим, что мне нужен ярлык для «ls ~ / notes», он закрывается, прежде чем я смогу просмотреть вывод. – emf 10 October 2010 в 07:41
  • 2
    Если бы было решение этого, это решило бы большинство случаев, которые я ищу. – emf 10 October 2010 в 07:42

Ответ æ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:~$
1
ответ дан 25 July 2018 в 23:08
  • 1
    Я думаю, что ваш скрипт может быть сведен к gnome-terminal -x sh -c "echo hello world; bash", и я не думаю, что этот вопрос требует. – ændrük 10 October 2010 в 03:13
  • 2
    Это выглядит круто. Можете ли вы объяснить, что здесь происходит? – emf 10 October 2010 в 07:38
  • 3
    e.m.fields: Я аннотировал его для вас. – msw 10 October 2010 в 09:35
  • 4
    ты жжешь. спасибо за аннотации, такая помощь делает барьер для входа со скриптами гораздо более доступным – emf 11 October 2010 в 09:41

Два ответа, которые мне наиболее понравились, это использовать 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 полезен для всех, кто читает этот вопрос.

0
ответ дан 27 July 2018 в 03:01

Если я правильно понимаю, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке 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] и удаление начального #.

8
ответ дан 27 July 2018 в 03:01
  • 1
    Хотя это не совсем то решение, которое я искал, это интересно само по себе. – emf 10 October 2010 в 07:39

Предложение æ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\""
8
ответ дан 27 July 2018 в 03:01

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

-1
ответ дан 27 July 2018 в 03:01
  • 1
    близко, но не совсем то, что я ищу. Одна из проблем заключается в том, что при выполнении и завершении терминал немедленно закрывается. Итак, предположим, что мне нужен ярлык для «ls ~ / notes», он закрывается, прежде чем я смогу просмотреть вывод. – emf 10 October 2010 в 07:41
  • 2
    Если бы было решение этого, это решило бы большинство случаев, которые я ищу. – emf 10 October 2010 в 07:42

Ответ æ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:~$
1
ответ дан 27 July 2018 в 03:01
  • 1
    Я думаю, что ваш скрипт может быть сведен к gnome-terminal -x sh -c "echo hello world; bash", и я не думаю, что этот вопрос требует. – ændrük 10 October 2010 в 03:13
  • 2
    Это выглядит круто. Можете ли вы объяснить, что здесь происходит? – emf 10 October 2010 в 07:38
  • 3
    e.m.fields: Я аннотировал его для вас. – msw 10 October 2010 в 09:35
  • 4
    ты жжешь. спасибо за аннотации, такая помощь делает барьер для входа со скриптами гораздо более доступным – emf 11 October 2010 в 09:41

Два ответа, которые мне наиболее понравились, это использовать 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 полезен для всех, кто читает этот вопрос.

0
ответ дан 31 July 2018 в 11:37

Если я правильно понимаю, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке 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] и удаление начального #.

8
ответ дан 31 July 2018 в 11:37
  • 1
    Хотя это не совсем то решение, которое я искал, это интересно само по себе. – emf 10 October 2010 в 07:39

Предложение æ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\""
8
ответ дан 31 July 2018 в 11:37

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

-1
ответ дан 31 July 2018 в 11:37
  • 1
    близко, но не совсем то, что я ищу. Одна из проблем заключается в том, что при выполнении и завершении терминал немедленно закрывается. Итак, предположим, что мне нужен ярлык для «ls ~ / notes», он закрывается, прежде чем я смогу просмотреть вывод. – emf 10 October 2010 в 07:41
  • 2
    Если бы было решение этого, это решило бы большинство случаев, которые я ищу. – emf 10 October 2010 в 07:42

Ответ æ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:~$
1
ответ дан 31 July 2018 в 11:37
  • 1
    Я думаю, что ваш скрипт может быть сведен к gnome-terminal -x sh -c "echo hello world; bash", и я не думаю, что этот вопрос требует. – ændrük 10 October 2010 в 03:13
  • 2
    Это выглядит круто. Можете ли вы объяснить, что здесь происходит? – emf 10 October 2010 в 07:38
  • 3
    e.m.fields: Я аннотировал его для вас. – msw 10 October 2010 в 09:35
  • 4
    ты жжешь. спасибо за аннотации, такая помощь делает барьер для входа со скриптами гораздо более доступным – emf 11 October 2010 в 09:41

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

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