Вместо того, чтобы перефразировать мой вопрос, позвольте мне описать вам желаемый случай пользователя:
Я создаю короткий shell-скрипт для запуска команды «gnome-terminal --someoptionflagname» мой текст, который будет опубликован '"и выполнить этот скрипт.
Выходит Gnome-терминал, с приглашением командной строки, за которым следует мой текст.
ie: fields@mycomputer:/$ my text to be posted
Можно ли это сделать?
Вы можете использовать аргументы -e
или -x
для запуска команды внутри недавно появившегося терминала, но это не совсем то, что вы хотите.
Ответ æ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: ~ $
Предложение æ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 \" мой текст будет опубликован \ ""
Если я правильно понял, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке gnome-terminal.
Я не знаю, как это сделать с помощью bash, но вот что-то, что приближается. В ~ / .bashrc
добавьте следующую строку в конец:
history -s "$ BASH_INITIAL_COMMAND"
] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash
, и нажмите «Вверх» в приглашении, чтобы вызвать текст.
Обратите внимание, что если вы положите set -o history
, а затем комментарии в конце вашего .bashrc
, они будут введены в историю по мере запуска bash, поэтому вы можете использовать их в качестве основы для редактирования путем обращения к ним с помощью клавиши Up и удаления начального #
.
Два ответа, которые мне наиболее понравились, это использовать ожидать
и этот , где они рекомендуют использовать - 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
полезен для всех, кто читает этот вопрос.
Вы можете использовать аргументы -e
или -x
для запуска команды внутри недавно появившегося терминала, но это не совсем то, что вы хотите.
Ответ æ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: ~ $
Если я правильно понял, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке gnome-terminal.
Я не знаю, как это сделать с помощью bash, но вот что-то, что приближается. В ~ / .bashrc
добавьте следующую строку в конец:
history -s "$ BASH_INITIAL_COMMAND"
] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash
, и нажмите «Вверх» в приглашении, чтобы вызвать текст.
Обратите внимание, что если вы положите set -o history
, а затем комментарии в конце вашего .bashrc
, они будут введены в историю по мере запуска bash, поэтому вы можете использовать их в качестве основы для редактирования путем обращения к ним с помощью клавиши Up и удаления начального #
.
Предложение æ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 \" мой текст будет опубликован \ ""
Два ответа, которые мне наиболее понравились, это использовать ожидать
и этот , где они рекомендуют использовать - 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
полезен для всех, кто читает этот вопрос.
Вы можете использовать аргументы -e
или -x
для запуска команды внутри недавно появившегося терминала, но это не совсем то, что вы хотите.
Ответ æ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: ~ $
Предложение æ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 \" мой текст будет опубликован \ ""
Если я правильно понял, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке gnome-terminal.
Я не знаю, как это сделать с помощью bash, но вот что-то, что приближается. В ~ / .bashrc
добавьте следующую строку в конец:
history -s "$ BASH_INITIAL_COMMAND"
] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash
, и нажмите «Вверх» в приглашении, чтобы вызвать текст.
Обратите внимание, что если вы положите set -o history
, а затем комментарии в конце вашего .bashrc
, они будут введены в историю по мере запуска bash, поэтому вы можете использовать их в качестве основы для редактирования путем обращения к ним с помощью клавиши Up и удаления начального #
.
Два ответа, которые мне наиболее понравились, это использовать ожидать
и этот , где они рекомендуют использовать - 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
полезен для всех, кто читает этот вопрос.
Вы можете использовать аргументы -e
или -x
для запуска команды внутри недавно появившегося терминала, но это не совсем то, что вы хотите.
Ответ æ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: ~ $
Если я правильно понял, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке gnome-terminal.
Я не знаю, как это сделать с помощью bash, но вот что-то, что приближается. В ~ / .bashrc
добавьте следующую строку в конец:
history -s "$ BASH_INITIAL_COMMAND"
] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash
, и нажмите «Вверх» в приглашении, чтобы вызвать текст.
Обратите внимание, что если вы положите set -o history
, а затем комментарии в конце вашего .bashrc
, они будут введены в историю по мере запуска bash, поэтому вы можете использовать их в качестве основы для редактирования путем обращения к ним с помощью клавиши Up и удаления начального #
.
Предложение æ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 \" мой текст будет опубликован \ ""
Два ответа, которые мне наиболее понравились, это использовать ожидать
и этот , где они рекомендуют использовать - 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
полезен для всех, кто читает этот вопрос.
Ответ æ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: ~ $
Предложение æ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 \" мой текст будет опубликован \ ""
Вы можете использовать аргументы -e
или -x
для запуска команды внутри недавно появившегося терминала, но это не совсем то, что вы хотите.
Если я правильно понял, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке gnome-terminal.
Я не знаю, как это сделать с помощью bash, но вот что-то, что приближается. В ~ / .bashrc
добавьте следующую строку в конец:
history -s "$ BASH_INITIAL_COMMAND"
] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash
, и нажмите «Вверх» в приглашении, чтобы вызвать текст.
Обратите внимание, что если вы положите set -o history
, а затем комментарии в конце вашего .bashrc
, они будут введены в историю по мере запуска bash, поэтому вы можете использовать их в качестве основы для редактирования путем обращения к ним с помощью клавиши Up и удаления начального #
.
Два ответа, которые мне наиболее понравились, это использовать ожидать
и этот , где они рекомендуют использовать - 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
полезен для всех, кто читает этот вопрос.
Вы можете использовать аргументы -e
или -x
для запуска команды внутри недавно появившегося терминала, но это не совсем то, что вы хотите.
Ответ æ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: ~ $
gnome-terminal -x sh -c & quot; echo hello world; bash "
, о котором я не думаю, что вопрос требует.
– ændrük
10 October 2010 в 03:13
Если я правильно понял, вы хотите, чтобы ваша первая строка ввода была заполнена содержимым, которое вы передаете в командной строке gnome-terminal.
Я не знаю, как это сделать с помощью bash, но вот что-то, что приближается. В ~ / .bashrc
добавьте следующую строку в конец:
history -s "$ BASH_INITIAL_COMMAND"
] Запустите gnome-terminal -x env BASH_INITIAL_COMMAND = 'мой текст, который будет опубликован' bash
, и нажмите «Вверх» в приглашении, чтобы вызвать текст.
Обратите внимание, что если вы положите set -o history
, а затем комментарии в конце вашего .bashrc
, они будут введены в историю по мере запуска bash, поэтому вы можете использовать их в качестве основы для редактирования путем обращения к ним с помощью клавиши Up и удаления начального #
.
Предложение æ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 \" мой текст будет опубликован \ ""
Два ответа, которые мне наиболее понравились, это использовать ожидать
и этот , где они рекомендуют использовать - 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
полезен для всех, кто читает этот вопрос.