Answers:
您可以使用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
如果您没有做太多的Shell编程,那么这里的魔力似乎比它多。首先,我命名一个用于保存脚本的临时文件,其中$$
是运行此脚本的Shell的进程ID。如果/tmp/something.$$
此脚本的两个实例同时运行,则使用该隐喻,它们将不会尝试使用相同的临时文件。
该变量$SHELL
设置为运行脚本的外壳的名称。如果使用/ usr / bin / bash,大概是您希望微型脚本也使用它。
这"$@"
是shell惯用语,用于“插入所有参数,并在需要时引用它们”。这种特殊的语法导致
script.sh 'my file' your\ file
将参数内插为两个元素
"my file" "your file"
而不是四个$@
会产生
"my" "file" "your" "file"
该脚本的最后几行安排一个gnome-terminal开始运行迷你脚本,然后启动一个交互式shell。当gnome-terminal退出时,由于乱丢垃圾会删除临时脚本。
最后一行不是迷你脚本的一部分,它表明迷你脚本有效。如果上面的11行脚本位于名为rt.sh
的chmod
文件中,则使其可执行并随后执行。
$ chmod +x rt.sh && ./rt.sh echo hello world
所有这些的结果将是一个启动的gnome终端,显示
hello world
在其第一行,然后启动一个交互式shell:
msw@myhost:~$
gnome-terminal -x sh -c "echo hello world; bash"
,但我认为这个问题并不是必需的。
我最喜欢解决此问题的两个答案是使用expect
,在此建议他们--init-file
在shebang或执行终端时使用标志:
#!/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
作为解决此问题的hack的问题是,shell在执行初始化脚本时无法访问STDIN。例如,如果我想运行某些需要用户输入的内容(例如ftp,telnet等),但随后又使父shell运行,它将无法正常工作;到目前为止,我所看到的唯一例外是ssh:
xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')
...但是我需要的比这个玩具示例还要复杂。无论如何,我希望这些--init-file
内容对阅读此问题的任何人都有用。