コマンドラインで既に入力されている特定のテキストで端末を起動するにはどうすればいいですか?


25

私の質問を言い換えるのではなく、希望するユーザーケースを説明しましょう。

「gnome-terminal --someoptionflagname '投稿するテキスト」というコマンドを実行する短いシェルスクリプトを作成し、このスクリプトを実行します。

Gnome-terminalがポップアップ表示され、コマンドラインプロンプトに続いてテキストが表示されます。

すなわち: fields@mycomputer:/$ my text to be posted

これはできますか?


このバグがUbuntuで修正された場合cneeを調べる必要があります。
エンドリューク

@ændrükこれは修正され、パッケージ名はxnee現在です。
デザート

回答:


32

expectinstall)でこれを行うことができます。作成して実行可能にする~/bin/myprompt

#!/usr/bin/expect -f

# Get a Bash shell
spawn -noecho bash

# Wait for a prompt
expect "$ "

# Type something
send "my text to be posted"

# Hand over control to the user
interact

exit

Gnomeターミナルを次のコマンドで実行します:

gnome-terminal -e ~/bin/myprompt

Expectを使用するための+1。私はこれを長年にわたって使用して、多くのことを自動化しました。
マルコセッピ

これはカッコいい。私は、デフォルトのgnome-terminal機能に基づいた単純な(少し)答えがあることを望んでいましたが、これは仕事に答えているように見えます。
EMF

これは長い間私を悩ませてきました。意図したユースケースが何であったかをほとんど思い出せませんでした。したがって、明確にするために、「gnome-terminal -e ls」のようなことをしたいのですが、問題はウィンドウを開いたままにしておくことです。したがって、基本的には、ターミナルを開いてシェルコマンドを実行するためのショートカットです。これにより、問題とaendruk / mswの回答が明確になりますか?
emf

1
コマンドの実行後に端末を開いたままにするだけで済む場合は、もっと簡単な解決策があります。
エンドリューク

本当にありがとう。これを呼び出して、Pentahoデータ統合ツールを呼び出すシェルスクリプトに正常に統合しました。その後、11.10でこのスクリプトの呼び出しをUnityランチャーに追加しましたが、これは魅力のように機能します。
bioShark

8

私が正しく理解していれば、最初の入力行を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キーを入力して最初のを削除することで、編集のベースとして使用できます#


2
私が探していた解決策ではありませんが、これはそれ自体が興味深いものです。
emf

8

æ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\""

1

æ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"、これは質問が求めているものではないと思います。
エンドリューク

これはかっこいいですね。ここで何が起こっているのか説明できますか?
emf

1
emfields:注釈を付けました。
msw

1
あなたが揺れます。注釈のおかげで、この種のヘルプにより、スクリプティングによるエントリの障壁がはるかにアクセスしやすくなります。
emf10年

0

私が一番気に入ってきた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-filegnome-terminal'sで遭遇した問題--commandは、initスクリプトの実行中にシェルがSTDINにアクセスできないことです。たとえば、ユーザー入力を必要とするもの(ftp、telnetなど)を実行したいが、その後親シェルを実行したままにしたい場合は機能しません。これまで見てきた唯一の例外はsshです:

xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')

...しかし、私が必要なのはこのおもちゃの例よりも複雑です。とにかく、私--init-fileはこの質問を読んでいる人にとって役に立つものであると思います。


-1

-eまたは-x引数を使用して、新しくポップアップされた端末内でコマンドを実行できますが、それはまさにあなたが望むものではありません。


近いが、私が探しているものではありません。この場合の問題の1つは、実行して終了すると、ターミナルがすぐに閉じることです。したがって、「ls〜/ notes」へのショートカットが必要だとしましょう。出力を表示する前に閉じます。
emf

これに対する解決策があれば、それは私が探しているほとんどの場合を解決するでしょう。
emf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.