对于一些次要的自动化,我一直在使用gnome-terminal命令,并且一直遇到相同的问题。目的是在与当前窗口相同的目录中打开一个新窗口,并执行一个简单的命令(即echo,cd或类似命令)。此命令似乎可以在同一目录中打开新窗口,效果很好:
DIR=$(pwd); gnome-terminal --working-directory=$DIR
但是,当我向其添加执行时,它会失败:
DIR=$(pwd); gnome-terminal --working-directory=$DIR -e 'echo "test"'
我收到一条消息,提示-e
已过时,我应该使用--
,所以我换成
DIR=$(pwd); gnome-terminal --working-directory=$DIR -- 'echo "test"'
但是我现在收到此错误:
Failed to execute child process “echo "test"” (No such file or directory)
有人知道为什么会这样吗?
确切的系统规格: Ubuntu 18.04,使用VTE 0.56.2 + GNUTLS的GNOME终端3.32.1
确切的弃用消息是:
# Option “-e” is deprecated and might be removed in a later version of gnome-terminal.
# Use “-- ” to terminate the options and put the command line to execute after it.
答案 0 :(得分:1)
啊。我知道了。这两个消息实际上是不同的。
# Option “-e” is deprecated and might be removed in a later version of gnome-terminal.
我认为这意味着您应该使用-x
,而不是将-x
之后的命令行中的所有内容都视为要执行的命令的一部分。
# Use “-- ” to terminate the options and put the command line to execute after it.
这是命令行程序中使用的约定。两个破折号表示以后出现的任何内容(无论是否带有破折号)都是 not 命令行选项。 有用与-x
结合使用,因为您可能不想将某些内容解析为gnome-terminal的选项之一-而是将它们作为命令行参数在终端内运行 。
我认为一个例子可能会更清楚...
gnome-terminal -x -- grep -v "42" hitchikers_guide_to_the_galaxy.txt
这将打开gnome终端。在终端内部,我们正在运行grep,并排除任何包含字符串“ 42”的行。如果我们没有使用--
,则gnome-terminal会将-v
视为gnome-terminal
的命令行参数,并可能引发警告说-v
不是有效的参数到gnome终端。
编辑:
好,-x
和-c
均已弃用。您可以执行不带任何标志的命令。它确实需要使用--
来终止所有其他选项...因此,我对我所说的一切都大错特错。理由很扎实,只是错误。
gnome-terminal -- nano
将打开一个新终端,并在终端内启动nano。
尝试时会遇到麻烦
gnome-terminal -- echo foo
它可以运行,但是它退出的速度如此之快,以至于除了屏幕上的闪光灯外您什么都看不到。
请注意,还有一个关于弃用-c
的公开错误:
答案 1 :(得分:0)
澄清 OP 中的问题,2 点:
为了
DIR=$(pwd); gnome-terminal --working-directory=$DIR -- 'echo "test"'
(无法解释的)错误表明“命令”是
echo "test"
即它试图运行存储在名为 echo "test"
的文件中的程序(作为 -- 之后的单个参数)。正确的语法是
DIR=$(pwd); gnome-terminal --working-directory=$DIR -- echo "test"
(没有)
但是(如 Barton Chittenden 所述)然后导致终端窗口几乎立即出现和消失(在执行回声后)(可能比屏幕刷新率快,看起来什么也没发生)。它需要一些延迟。所以试试
DIR=$(pwd); gnome-terminal --working-directory=$DIR -- echo "test" ; sleep 5
(我知道错了,等分析)
但这似乎更长时间没有任何作用。原因:- ;
是保留符号(控制运算符)并终止 gnome-terminal
的参数列表。 sleep 5
是在(什么都不做)gnome-terminal
之后执行的单独命令。试图引用 ;无效:
DIR=$(pwd); gnome-terminal --working-directory=$DIR -- echo "test" \; sleep 5
如果您想要显示 test ,这在语法上是有效的;在纳秒窗口内睡眠 5。不,这里的问题是我们正在尝试执行命令 LIST 而不是命令(单个可执行文件)。所以答案是:
使用“sh -c”在新窗口中执行通用命令行:
DIR=$(pwd); gnome-terminal --working-directory=$DIR -- sh -c 'echo "test" ; sleep 5'
也许
DIR=$(pwd); gnome-terminal --working-directory=$DIR -- sh -c 'echo "test" ; echo Press ENTER to continue ; read a'
附言对于学究,我知道周围的空间;和 " 周围(单个单词)测试是不必要的。此外,我使用了通用 sh
来表示目标系统上使用的任何版本(并假设 -c
在 Bourne shell 中工作).此外,shell变量(示例中的DIR
)是多余的,只需使用--working-directory=$(pwd)
,除非您想在后续命令(行)中再次使用该值。实际上,在我的测试中, gnome-terminal
在调用进程的当前目录中开始,所以 --working-directory
在这里几乎肯定是多余的。最后,问题想打印“Hello World”,所以(完全和最低限度)正确答案(添加延迟)是:
gnome-terminal -- sh -c 'echo Hello World;sleep 5'
P.P.S.在测试(已弃用)-e
和 -x
选项时,注意到以下内容 (V3.28.2):
-x
与 --
具有相同的效果,但仍禁止进一步的参数处理。这可能解释了“奇数”错误
#_g_io_module_get_default: Found default implementation gvfs (GDaemonVfs) for ‘gio-vfs’
因为它正在尝试执行命令 --
。 (在我的测试中没有得到这个确切的错误,只是标准的 "--" No such file or directory
。)
-e
作为命令行但而不是作为 sh(1) 输入调用其参数。参数在空格边界(测试空格、制表符和换行符)处被解析为 words,允许 \(引号包括空格的单个字符)以及 " 和 '(引号括起来的字符串,未观察到区别。第一个词是命令名。它必须是可执行文件的路径(绝对、相对或$PATH
可找到),不是shell仅内置(例如 read
、cd
与具有相应外部二进制文件的 shell 内置程序,例如 echo
、sleep
)。使用剩余的 词 作为参数(可能使用 exec(3)
,因为 system(3)
会识别 shell 语法)。-e
覆盖任何其他命令调用选项,即 --
, -x
。