내 질문을 바꾸지 말고 원하는 사용자 사례를 설명해 드리겠습니다.
"gnome-terminal --someoptionflagname 'my text to post'"명령을 실행하기위한 짧은 쉘 스크립트를 작성하고이 스크립트를 실행합니다.
명령 행 프롬프트와 함께 텍스트가 표시된 그놈 터미널이 나타납니다.
즉 : fields@mycomputer:/$ my text to be posted
이것을 할 수 있습니까?
내 질문을 바꾸지 말고 원하는 사용자 사례를 설명해 드리겠습니다.
"gnome-terminal --someoptionflagname 'my text to post'"명령을 실행하기위한 짧은 쉘 스크립트를 작성하고이 스크립트를 실행합니다.
명령 행 프롬프트와 함께 텍스트가 표시된 그놈 터미널이 나타납니다.
즉 : 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 Terminal을 실행하십시오.
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 Terminal을 실행하십시오.
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.$$
은유는이 스크립트의 두 인스턴스가 동시에 실행되는 경우에 사용됩니다, 그들은 같은 임시 파일을 사용하려고하지 않을 것이다.
변수 $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"
있다고 생각합니다.
내가 가장 좋아 한 두 가지 대답이 사용을 해결 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-file
및 gnome-terminal
의 --command
해킹으로이 init로 스크립트를 실행하는 동안 STDIN에 대한 액세스 권한이없는 쉘입니다 해결합니다. 예를 들어, 사용자 입력 (ftp, telnet 등)이 필요한 항목을 실행하고 싶지만 나중에 부모 쉘이 작동하지 않으면 작동하지 않습니다. 내가 지금까지 본 유일한 예외는 ssh입니다.
xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')
...하지만 필요한 것은이 장난감 예제보다 복잡합니다. 어쨌든, 나는 --init-file
이 질문을 읽는 사람에게 도움이 되기를 바랍니다 .