我有一个包含服务器列表的文件:
SERVERS.TXT:
192.168.0.100
192.168.0.101
192.168.0.102
从gnome终端脚本,我想打开一个新的终端,每个服务器都有一个标签。
以下是我的尝试:
gnome-terminal --profile=TabProfile `while read SERVER ; do echo "--tab -e 'ssh usr@$SERVER'"; done < SERVERS.TXT`
这是错误:
无法解析参数:“--command / -e”的参数不是有效命令:文本在找到'匹配引号'之前结束。 (文字是''ssh')
尝试删除-e
之后的空格gnome-terminal --profile=TabProfile `while read SERVER ; do echo "--tab -e'ssh usr@$SERVER'"; done < SERVERS.TXT`
我得到了类似的错误:
无法解析参数:“--command / -e”的参数不是有效命令:文本在找到'匹配引号'之前结束。 (案文是'usr@192.168.0.100'')
显然有一个解析错误,因为shell试图通过使用空格来预测和放置分隔符来提供帮助。服务器文件如有更改,恕不另行通知,需要查看许多不同的服务器集。
答案 0 :(得分:1)
我会尝试类似的事情:
$ while read SERVER;do echo -n "--tab -e 'ssh usr@$SERVER' "; \
done < SERVERS.txt | xargs gnome-terminal --profile=TabProfile
这是为了避免shell可以对参数做任何解释(任何以破折号开头的东西)。
因为它是连接字符串(使用-n
),所以需要在它们之间添加空格。
答案 1 :(得分:1)
这是解析命令行选项的问题吗?有时如果你有一个命令向另一个命令发送参数,第一个可能会混淆。惯例是使用像这样的--
:
echo -- "--tab -e 'ssh usr@$SERVER'";
答案 2 :(得分:1)
我在寻找OP所遇问题的答案时发现了这个问题,但我的问题有点不同。我知道服务器列表,它们不在文件中。
无论如何,发布的其他解决方案对我来说不起作用,但以下脚本确实有效,而且我用它来解决"--command/-e" is not a valid command"
错误。
脚本应该很容易更改以满足任何需要:
#!/bin/sh
# Open a terminal to each of the servers
#
# The list of servers
LIST="server1.info server2.info server3.info server4.info"
cmdssh=`which ssh`
for s in $LIST
do
title=`echo -n "${s}" | sed 's/^\(.\)/\U\1/'`
args="${args} --tab --title=\"$title\" --command=\"${cmdssh} ${s}.com\""
done
tmpfile=`mktemp`
echo "gnome-terminal${args}" > $tmpfile
chmod 744 $tmpfile
. $tmpfile
rm $tmpfile
现在最大的问题是,为什么从文件运行时这是有效的,而不是从脚本中运行。当然,问题是关于--command
部分的转义,但我尝试的一切都失败了,除非导出到临时文件。
答案 3 :(得分:0)
尝试输入
EVAL
在gnome终端命令之前。
它应该是这样的:
eval /usr/bin/gnome-terminal $xargs
为我工作!