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

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

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

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

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

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

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

60 ответов

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

-1
ответ дан 2 August 2018 в 04:28

Ответ ændrük в порядке, но, возможно, маленький тяжеловес для задачи.

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

  #! / bin  / sh # terminal-plus-command: запустите подчиненный терминал, который запускает # интерактивную оболочку после первого запуска командных аргументов tmpscript = / tmp / tmpscript. $$ echo "#! $ SHELL" & gt;  $ tmpscript echo "$ @" & gt; & gt; & gt; & gt;  $ tmpscript echo exec "$ SHELL" & gt; & gt; & gt;  $ tmpscript chmod + x $ tmpscript gnome-terminal --command $ tmpscript rm -f $ tmpscript  

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

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

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

  script.sh 'мой файл' your \ file  

для интерполяции аргументов как двух элементов

  «мой файл» «ваш файл»  

вместо четырех, что $ @ даст

  "мой"  «file» «your» «file»  

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

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

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

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

  hello world  

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

  msw @ myhost: ~ $  
1
ответ дан 2 August 2018 в 04:28

Предложение ændrük очень хорошее и работает для меня, однако команда жестко закодирована в скрипте, и если вы измените размер окна терминала, это не сработает. Используя свой код в качестве базы, я добавил возможность отправить скрипт myprompt в качестве аргумента, и этот скрипт правильно обрабатывает изменение размера окна терминала.

  #! / Usr / bin  / ожидать #trap sigwinch и передать его ребенку, который мы породили #this позволяет изменять размер окна окна gnome {set rows [stty rows] set cols [stty columns] stty rows $ rows columns $ cols & lt;  $ spawn_out (slave, name)} WINCH set arg1 [lindex $ argv 0] # Получить оболочку Bash spawn -noecho bash # Подождать, пока появится приглашение «$» # Введите что-то отправить $ arg1 # Передать управление пользователю перейти на выход   

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

  gnome-terminal -e "~ / bin / myprompt \" мой текст будет опубликован \ ""  
8
ответ дан 2 August 2018 в 04:28

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

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

  history -s "$ BASH_INITIAL_COMMAND"  

] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash , и нажмите «Вверх» в приглашении, чтобы вызвать текст.

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

8
ответ дан 2 August 2018 в 04:28

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

  #! / bin / bash - команды для запуска  

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

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

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

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

  xterm -e / bin / bash --init-file & lt; (echo 'ssh -X some-machine)) [  ! d9] 

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

0
ответ дан 2 August 2018 в 04:28

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

-1
ответ дан 4 August 2018 в 21:01

Ответ ændrük в порядке, но, возможно, маленький тяжеловес для задачи.

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

  #! / bin  / sh # terminal-plus-command: запустите подчиненный терминал, который запускает # интерактивную оболочку после первого запуска командных аргументов tmpscript = / tmp / tmpscript. $$ echo "#! $ SHELL" & gt;  $ tmpscript echo "$ @" & gt; & gt; & gt; & gt;  $ tmpscript echo exec "$ SHELL" & gt; & gt; & gt;  $ tmpscript chmod + x $ tmpscript gnome-terminal --command $ tmpscript rm -f $ tmpscript  

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

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

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

  script.sh 'мой файл' your \ file  

для интерполяции аргументов как двух элементов

  «мой файл» «ваш файл»  

вместо четырех, что $ @ даст

  "мой"  «file» «your» «file»  

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

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

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

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

  hello world  

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

  msw @ myhost: ~ $  
1
ответ дан 4 August 2018 в 21:01

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

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

  history -s "$ BASH_INITIAL_COMMAND"  

] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash , и нажмите «Вверх» в приглашении, чтобы вызвать текст.

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

8
ответ дан 4 August 2018 в 21:01

Предложение ændrük очень хорошее и работает для меня, однако команда жестко закодирована в скрипте, и если вы измените размер окна терминала, это не сработает. Используя свой код в качестве базы, я добавил возможность отправить скрипт myprompt в качестве аргумента, и этот скрипт правильно обрабатывает изменение размера окна терминала.

  #! / Usr / bin  / ожидать #trap sigwinch и передать его ребенку, который мы породили #this позволяет изменять размер окна окна gnome {set rows [stty rows] set cols [stty columns] stty rows $ rows columns $ cols & lt;  $ spawn_out (slave, name)} WINCH set arg1 [lindex $ argv 0] # Получить оболочку Bash spawn -noecho bash # Подождать, пока появится приглашение «$» # Введите что-то отправить $ arg1 # Передать управление пользователю перейти на выход   

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

  gnome-terminal -e "~ / bin / myprompt \" мой текст будет опубликован \ ""  
8
ответ дан 4 August 2018 в 21:01

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

  #! / bin / bash - команды для запуска  

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

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

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

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

  xterm -e / bin / bash --init-file & lt; (echo 'ssh -X some-machine)) [  ! d9] 

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

0
ответ дан 4 August 2018 в 21:01

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

-1
ответ дан 6 August 2018 в 04:33

Ответ ændrük в порядке, но, возможно, маленький тяжеловес для задачи.

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

  #! / bin  / sh # terminal-plus-command: запустите подчиненный терминал, который запускает # интерактивную оболочку после первого запуска командных аргументов tmpscript = / tmp / tmpscript. $$ echo "#! $ SHELL" & gt;  $ tmpscript echo "$ @" & gt; & gt; & gt; & gt;  $ tmpscript echo exec "$ SHELL" & gt; & gt; & gt;  $ tmpscript chmod + x $ tmpscript gnome-terminal --command $ tmpscript rm -f $ tmpscript  

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

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

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

  script.sh 'мой файл' your \ file  

для интерполяции аргументов как двух элементов

  «мой файл» «ваш файл»  

вместо четырех, что $ @ даст

  "мой"  «file» «your» «file»  

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

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

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

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

  hello world  

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

  msw @ myhost: ~ $  
1
ответ дан 6 August 2018 в 04:33

Предложение ændrük очень хорошее и работает для меня, однако команда жестко закодирована в скрипте, и если вы измените размер окна терминала, это не сработает. Используя свой код в качестве базы, я добавил возможность отправить скрипт myprompt в качестве аргумента, и этот скрипт правильно обрабатывает изменение размера окна терминала.

  #! / Usr / bin  / ожидать #trap sigwinch и передать его ребенку, который мы породили #this позволяет изменять размер окна окна gnome {set rows [stty rows] set cols [stty columns] stty rows $ rows columns $ cols & lt;  $ spawn_out (slave, name)} WINCH set arg1 [lindex $ argv 0] # Получить оболочку Bash spawn -noecho bash # Подождать, пока появится приглашение «$» # Введите что-то отправить $ arg1 # Передать управление пользователю перейти на выход   

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

  gnome-terminal -e "~ / bin / myprompt \" мой текст будет опубликован \ ""  
8
ответ дан 6 August 2018 в 04:33

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

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

  history -s "$ BASH_INITIAL_COMMAND"  

] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash , и нажмите «Вверх» в приглашении, чтобы вызвать текст.

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

8
ответ дан 6 August 2018 в 04:33

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

  #! / bin / bash - команды для запуска  

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

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

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

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

  xterm -e / bin / bash --init-file & lt; (echo 'ssh -X some-machine)) [  ! d9] 

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

0
ответ дан 6 August 2018 в 04:33

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

-1
ответ дан 7 August 2018 в 22:42

Ответ ændrük в порядке, но, возможно, маленький тяжеловес для задачи.

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

  #! / bin  / sh # terminal-plus-command: запустите подчиненный терминал, который запускает # интерактивную оболочку после первого запуска командных аргументов tmpscript = / tmp / tmpscript. $$ echo "#! $ SHELL" & gt;  $ tmpscript echo "$ @" & gt; & gt; & gt; & gt;  $ tmpscript echo exec "$ SHELL" & gt; & gt; & gt;  $ tmpscript chmod + x $ tmpscript gnome-terminal --command $ tmpscript rm -f $ tmpscript  

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

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

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

  script.sh 'мой файл' your \ file  

для интерполяции аргументов как двух элементов

  «мой файл» «ваш файл»  

вместо четырех, что $ @ даст

  "мой"  «file» «your» «file»  

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

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

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

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

  hello world  

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

  msw @ myhost: ~ $  
1
ответ дан 7 August 2018 в 22:42

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

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

  history -s "$ BASH_INITIAL_COMMAND"  

] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash , и нажмите «Вверх» в приглашении, чтобы вызвать текст.

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

8
ответ дан 7 August 2018 в 22:42

Предложение ændrük очень хорошее и работает для меня, однако команда жестко закодирована в скрипте, и если вы измените размер окна терминала, это не сработает. Используя свой код в качестве базы, я добавил возможность отправить скрипт myprompt в качестве аргумента, и этот скрипт правильно обрабатывает изменение размера окна терминала.

  #! / Usr / bin  / ожидать #trap sigwinch и передать его ребенку, который мы породили #this позволяет изменять размер окна окна gnome {set rows [stty rows] set cols [stty columns] stty rows $ rows columns $ cols & lt;  $ spawn_out (slave, name)} WINCH set arg1 [lindex $ argv 0] # Получить оболочку Bash spawn -noecho bash # Подождать, пока появится приглашение «$» # Введите что-то отправить $ arg1 # Передать управление пользователю перейти на выход   

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

  gnome-terminal -e "~ / bin / myprompt \" мой текст будет опубликован \ ""  
8
ответ дан 7 August 2018 в 22:42

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

  #! / bin / bash - команды для запуска  

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

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

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

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

  xterm -e / bin / bash --init-file & lt; (echo 'ssh -X some-machine)) [  ! d9] 

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

0
ответ дан 7 August 2018 в 22:42

Ответ ændrük в порядке, но, возможно, маленький тяжеловес для задачи.

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

  #! / bin  / sh # terminal-plus-command: запустите подчиненный терминал, который запускает # интерактивную оболочку после первого запуска командных аргументов tmpscript = / tmp / tmpscript. $$ echo "#! $ SHELL" & gt;  $ tmpscript echo "$ @" & gt; & gt; & gt; & gt;  $ tmpscript echo exec "$ SHELL" & gt; & gt; & gt;  $ tmpscript chmod + x $ tmpscript gnome-terminal --command $ tmpscript rm -f $ tmpscript  

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

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

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

  script.sh 'мой файл' your \ file  

для интерполяции аргументов как двух элементов

  «мой файл» «ваш файл»  

вместо четырех, что $ @ даст

  "мой"  «file» «your» «file»  

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

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

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

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

  hello world  

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

  msw @ myhost: ~ $  
1
ответ дан 10 August 2018 в 10:48

Предложение ændrük очень хорошее и работает для меня, однако команда жестко закодирована в скрипте, и если вы измените размер окна терминала, это не сработает. Используя свой код в качестве базы, я добавил возможность отправить скрипт myprompt в качестве аргумента, и этот скрипт правильно обрабатывает изменение размера окна терминала.

  #! / Usr / bin  / ожидать #trap sigwinch и передать его ребенку, который мы породили #this позволяет изменять размер окна окна gnome {set rows [stty rows] set cols [stty columns] stty rows $ rows columns $ cols & lt;  $ spawn_out (slave, name)} WINCH set arg1 [lindex $ argv 0] # Получить оболочку Bash spawn -noecho bash # Подождать, пока появится приглашение «$» # Введите что-то отправить $ arg1 # Передать управление пользователю перейти на выход   

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

  gnome-terminal -e "~ / bin / myprompt \" мой текст будет опубликован \ ""  
8
ответ дан 10 August 2018 в 10:48

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

-1
ответ дан 10 August 2018 в 10:48

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

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

  history -s "$ BASH_INITIAL_COMMAND"  

] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash , и нажмите «Вверх» в приглашении, чтобы вызвать текст.

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

8
ответ дан 10 August 2018 в 10:48

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

  #! / bin / bash - команды для запуска  

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

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

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

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

  xterm -e / bin / bash --init-file & lt; (echo 'ssh -X some-machine)) [  ! d9] 

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

0
ответ дан 10 August 2018 в 10:48

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

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

Ответ ændrük в порядке, но, возможно, маленький тяжеловес для задачи.

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

  #! / bin  / sh # terminal-plus-command: запустите подчиненный терминал, который запускает # интерактивную оболочку после первого запуска командных аргументов tmpscript = / tmp / tmpscript. $$ echo "#! $ SHELL" & gt;  $ tmpscript echo "$ @" & gt; & gt; & gt; & gt;  $ tmpscript echo exec "$ SHELL" & gt; & gt; & gt;  $ tmpscript chmod + x $ tmpscript gnome-terminal --command $ tmpscript rm -f $ tmpscript  

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

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

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

  script.sh 'мой файл' your \ file  

для интерполяции аргументов как двух элементов

  «мой файл» «ваш файл»  

вместо четырех, что $ @ даст

  "мой"  «file» «your» «file»  

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

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

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

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

  hello world  

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

  msw @ myhost: ~ $  
1
ответ дан 13 August 2018 в 17:22
  • 1
    Я думаю, что ваш скрипт может быть сведен к gnome-terminal -x sh -c & quot; 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

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

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

  history -s "$ BASH_INITIAL_COMMAND"  

] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash , и нажмите «Вверх» в приглашении, чтобы вызвать текст.

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

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

Предложение ændrük очень хорошее и работает для меня, однако команда жестко закодирована в скрипте, и если вы измените размер окна терминала, это не сработает. Используя свой код в качестве базы, я добавил возможность отправить скрипт myprompt в качестве аргумента, и этот скрипт правильно обрабатывает изменение размера окна терминала.

  #! / Usr / bin  / ожидать #trap sigwinch и передать его ребенку, который мы породили #this позволяет изменять размер окна окна gnome {set rows [stty rows] set cols [stty columns] stty rows $ rows columns $ cols & lt;  $ spawn_out (slave, name)} WINCH set arg1 [lindex $ argv 0] # Получить оболочку Bash spawn -noecho bash # Подождать, пока появится приглашение «$» # Введите что-то отправить $ arg1 # Передать управление пользователю перейти на выход   

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

  gnome-terminal -e "~ / bin / myprompt \" мой текст будет опубликован \ ""  
8
ответ дан 13 August 2018 в 17:22

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

  #! / bin / bash - команды для запуска  

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

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

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

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

  xterm -e / bin / bash --init-file & lt; (echo 'ssh -X some-machine)) [  ! d9] 

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

0
ответ дан 13 August 2018 в 17:22

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

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