명령 행에 특정 텍스트가 이미 입력되어있는 터미널을 시작하는 방법은 무엇입니까?


25

내 질문을 바꾸지 말고 원하는 사용자 사례를 설명해 드리겠습니다.

"gnome-terminal --someoptionflagname 'my text to post'"명령을 실행하기위한 짧은 쉘 스크립트를 작성하고이 스크립트를 실행합니다.

명령 행 프롬프트와 함께 텍스트가 표시된 그놈 터미널이 나타납니다.

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

이것을 할 수 있습니까?


경우 이 버그는 지금까지 우분투에서 해결 당신은 조사해야 cnee .
ændrük

@ ændrük 수정되었고 패키지 이름이 변경 xnee되었습니다.
디저트

답변:


32

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 Terminal을 실행하십시오.

gnome-terminal -e ~/bin/myprompt

Expect 사용시 +1 나는 이것을 많은 것들을 자동화하기 위해 수년 동안 사용 해왔다.
Marco Ceppi

이것은 멋지다. 기본 그놈 터미널 기능을 기반으로 한 간단한 대답이 있기를 바랐지만이 작업에 응답하는 것처럼 보입니다.
emf

이것은 오랫동안 나를 괴롭 혔습니다. 의도 된 유스 케이스가 무엇인지 거의 기억하지 못했습니다. 그래서, 설명을 위해 : "gnome-terminal -e ls"와 같은 것을하고 싶지만, 캐치가 열린 채로 창을 유지하는 것이 좋습니다. 따라서 기본적으로 터미널을 열고 쉘 명령을 실행하는 바로 가기입니다. 이것이 문제 대 aendruk / msw의 답변을 명확하게합니까?
emf

1
명령 후에도 터미널이 열려있는 상태라면 훨씬 간단한 해결책이 있습니다.
ændrük

고마워 필자는 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, 끝에 주석 다음에 주석 을 넣으면 .bashrcbash가 시작될 때 기록에 기록되므로 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 Terminal을 실행하십시오.

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.$$은유는이 스크립트의 두 인스턴스가 동시에 실행되는 경우에 사용됩니다, 그들은 같은 임시 파일을 사용하려고하지 않을 것이다.

변수 $SHELL는 스크립트를 실행하는 쉘의 이름으로 설정됩니다. / usr / bin / bash를 사용한다면 아마도 미니 스크립트도 사용하고 싶을 것입니다.

"$@""필요한 경우를 인용, 내 모든 인수를 보간"에 대한 쉘 관용구이다. 이 독특한 구문은

script.sh 'my file' your\ file

인수를 두 요소로 보간

"my file" "your file"

$@양보 하는 4 개 대신

"my" "file" "your" "file"

스크립트의 마지막 줄은 그놈 터미널이 미니 스크립트 실행을 시작한 다음 대화식 쉘을 시작하도록 정렬합니다. 그놈 터미널이 종료되면 쓰레기가 냉정하지 않기 때문에 임시 스크립트가 제거됩니다.

마지막 줄은 미니 스크립트의 일부가 아니며 미니 스크립트가 작동 함을 보여줍니다. 11 줄 스크립트 위라는 파일에있는 경우 rt.sh다음은 chmod그것을 실행하게 한 후 실행됩니다.

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

이 모든 것의 결과는 시작되고 표시되는 그놈 터미널입니다.

hello world

첫 번째 줄에서 대화식 쉘을 시작합니다.

msw@myhost:~$

귀하의 스크립트가로 축소 될 수 gnome-terminal -x sh -c "echo hello world; bash"있다고 생각합니다.
ændrük

멋지다. 여기서 무슨 일이 일어나고 있는지 설명해 주시겠습니까?
emf

1
emfields : 나는 당신을 위해 주석을 달았습니다.
msw

1
당신은 바위. 주석 덕분에 이런 종류의 도움으로 스크립팅을 통한 진입 장벽에 훨씬 쉽게 접근 할 수 있습니다
emf

0

내가 가장 좋아 한 두 가지 대답이 사용을 해결 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는의와에 문제의 I 달렸다 --init-filegnome-terminal--command해킹으로이 init로 스크립트를 실행하는 동안 STDIN에 대한 액세스 권한이없는 쉘입니다 해결합니다. 예를 들어, 사용자 입력 (ftp, telnet 등)이 필요한 항목을 실행하고 싶지만 나중에 부모 쉘이 작동하지 않으면 작동하지 않습니다. 내가 지금까지 본 유일한 예외는 ssh입니다.

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

...하지만 필요한 것은이 장난감 예제보다 복잡합니다. 어쨌든, 나는 --init-file이 질문을 읽는 사람에게 도움이 되기를 바랍니다 .


-1

-eor -x인수를 사용하여 새로 팝업 된 터미널 내에서 명령을 실행할 수 있지만 원하는 것은 아닙니다.


가까이 있지만, 내가 찾고있는 것은 아닙니다. 이 경우 한 가지 문제점은 실행 및 완료시 터미널이 즉시 닫히는 것입니다. 따라서 "ls ~ / notes"에 대한 바로 가기를 원한다고 가정하면 출력을보기 전에 닫힙니다.
emf

이것에 대한 해결책이 있다면, 내가 찾고있는 대부분의 경우를 해결할 것입니다.
emf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.