私の質問を言い換えるのではなく、希望するユーザーケースを説明しましょう。
「gnome-terminal --someoptionflagname '投稿するテキスト」というコマンドを実行する短いシェルスクリプトを作成し、このスクリプトを実行します。
Gnome-terminalがポップアップ表示され、コマンドラインプロンプトに続いてテキストが表示されます。
すなわち: fields@mycomputer:/$ my text to be posted
これはできますか?
私の質問を言い換えるのではなく、希望するユーザーケースを説明しましょう。
「gnome-terminal --someoptionflagname '投稿するテキスト」というコマンドを実行する短いシェルスクリプトを作成し、このスクリプトを実行します。
Gnome-terminalがポップアップ表示され、コマンドラインプロンプトに続いてテキストが表示されます。
すなわち: fields@mycomputer:/$ my text to be posted
これはできますか?
回答:
expect(install)でこれを行うことができます。作成して実行可能にする~/bin/myprompt
:
#!/usr/bin/expect -f
# Get a Bash shell
spawn -noecho bash
# Wait for a prompt
expect "$ "
# Type something
send "my text to be posted"
# Hand over control to the user
interact
exit
Gnomeターミナルを次のコマンドで実行します:
gnome-terminal -e ~/bin/myprompt
私が正しく理解していれば、最初の入力行をgnome-terminalコマンドラインで渡す内容に事前に入力しておく必要があります。
これをbashで正確に行う方法はわかりませんが、ここに近づいてきました。あなたには~/.bashrc
、非常に最後に次の行を追加します。
history -s "$BASH_INITIAL_COMMAND"
を実行し、プロンプトでをgnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash
押しUpてテキストを呼び出します。
またset -o history
、の最後にコメントを続けて.bashrc
入力すると、bashの開始時にコメントが履歴に入力されるため、Upキーを入力して最初のを削除することで、編集のベースとして使用できます#
。
ændrükの提案は非常に良く、私にとってはうまくいきましたが、コマンドはスクリプト内でハードコーディングされており、ターミナルウィンドウのサイズを変更するとうまく機能しません。彼のコードをベースとして、コマンドとして引数としてmypromptスクリプトを送信する機能を追加しました。このスクリプトは、ターミナルウィンドウのサイズ変更を正しく処理します。
#!/usr/bin/expect
#trap sigwinch and pass it to the child we spawned
#this allows the gnome-terminal window to be resized
trap {
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
set arg1 [lindex $argv 0]
# Get a Bash shell
spawn -noecho bash
# Wait for a prompt
expect "$ "
# Type something
send $arg1
# Hand over control to the user
interact
exit
Gnomeターミナルを次のコマンドで実行します:
gnome-terminal -e "~/bin/myprompt \"my text to be posted\""
ændrükの答えは問題ありませんが、おそらくこのタスクには少し重いでしょう。
引数に基づいてスクリプトを作成するスクリプトを次に示します
#!/bin/sh
# terminal-plus-command: start a subordinate terminal which runs
# the interactive shell after first running the command arguments
tmpscript=/tmp/tmpscript.$$
echo "#!$SHELL" > $tmpscript
echo "$@" >> $tmpscript
echo exec "$SHELL" >> $tmpscript
chmod +x $tmpscript
gnome-terminal --command $tmpscript
rm -f $tmpscript
シェルプログラミングをあまり行っていない場合は、ここよりも多くの魔法があるように見えます。まず、スクリプトを保持する一時ファイルに名前を付けます。ここ$$
で、このスクリプトを実行しているシェルのプロセスIDです。この/tmp/something.$$
メタファーは、このスクリプトの2つのインスタンスが同時に実行される場合に使用され、同じ一時ファイルを使用しようとしません。
変数$SHELL
は、スクリプトを実行しているシェルの名前に設定されます。/ usr / bin / bashを使用する場合、おそらくミニスクリプトでも使用したいでしょう。
"$@"
「必要に応じてそれらを引用し、すべての私の引数を補間する」ためのシェルイディオムです。この独特の構文は
script.sh 'my file' your\ file
引数を2つの要素として補間する
"my file" "your file"
$@
生成される4つの代わりに
"my" "file" "your" "file"
スクリプトの最後の行は、gnome-terminalがミニスクリプトの実行を開始し、次に対話型シェルを開始するように配置します。gnome-terminalが終了すると、ポイ捨てがクールではないため、一時スクリプトが削除されます。
最後の行はミニスクリプトの一部ではなく、ミニスクリプトが機能することを示しています。上記11行のスクリプトと呼ばれるファイルである場合はrt.sh
、その後chmod
、それは実行し、それが実行されます。
$ chmod +x rt.sh && ./rt.sh echo hello world
このすべての結果は、起動して表示されるgnome端末になります
hello world
最初の行で、対話型シェルを開始します。
msw@myhost:~$
gnome-terminal -x sh -c "echo hello world; bash"
、これは質問が求めているものではないと思います。
私が一番気に入ってきた2つの答えが、この使用していることを解決するexpect
と、このいずれか、彼らが使用することをお勧め--init-file
シェバングのいずれかのフラグをまたは端末を実行する場合:
#!/bin/bash --init-file
commands to run
...そして次のように実行します:
xterm -e /path/to/script
# or
gnome-terminal -e /path/to/script
# or
the-terminal -e bash --init-file /path/to/script/with/no/shebang
expect
私がターゲット環境にインストールするかどうかを制御できないことを除いて、おそらくより良い解決策です(理由を説明します)
これを解決するためのハックとして私がbash --init-file
とgnome-terminal
'sで遭遇した問題--command
は、initスクリプトの実行中にシェルがSTDINにアクセスできないことです。たとえば、ユーザー入力を必要とするもの(ftp、telnetなど)を実行したいが、その後親シェルを実行したままにしたい場合は機能しません。これまで見てきた唯一の例外はsshです:
xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')
...しかし、私が必要なのはこのおもちゃの例よりも複雑です。とにかく、私--init-file
はこの質問を読んでいる人にとって役に立つものであると思います。