it-swarm.cn

如何使用已经在命令行中输入某些文本的方式启动终端?

除了让我重述我的问题外,让我向您介绍所需的用例:

我创建了一个简短的Shell脚本来运行命令“ gnome-terminal --someoptionflagname'我要发布的文本'”,并执行此脚本。

弹出Gnome终端,并在命令行提示后输入我的文字。

即:[email protected]:/$ my text to be posted

能做到吗?

25
emf

您可以使用 期望安装 )来执行此操作。创建并制作可执行文件~/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
32
ændrük

如果我理解正确,那么您希望您的第一条输入行被预填充到在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 键并删除首字母#

8
Gilles

æ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\""
8
Gordon McCreight

æ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 "[email protected]" >> $tmpscript
echo exec "$Shell" >> $tmpscript
chmod +x $tmpscript
gnome-terminal --command $tmpscript
rm -f $tmpscript

如果您没有做太多的Shell编程,那么这里的魔术似乎比实际更多。首先,我命名一个用于保存脚本的临时文件,其中$$是运行此脚本的Shell的进程ID。如果此脚本的两个实例同时运行,则使用/tmp/something.$$隐喻,它们不会尝试使用相同的临时文件。

变量$Shell设置为运行脚本的Shell的名称。如果使用/ usr/bin/bash,大概是您希望微型脚本也使用它。

"[email protected]"是Shell惯用语,用于“插入我的所有参数,并在需要时引用它们”。这种特殊的语法导致

script.sh 'my file' your\ file

将参数内插为两个元素

"my file" "your file"

而不是[email protected]将产生的四个

"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:

[email protected]:~$
1
msw

我最喜欢解决的两个答案是使用expect(此一个 ),他们建议在Shebang或执行终端时使用--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--command的问题,这是Shell在执行初始化脚本时无法访问STDIN。例如,如果我想运行某些需要用户输入的内容(例如ftp,telnet等),但随后又让父Shell运行,它将无法正常工作;到目前为止,我所看到的唯一例外是ssh:

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

...但是我需要的比这个玩具示例还要复杂。无论如何,我希望--init-file的内容对阅读此问题的任何人有用。

0
Brian Vandenberg