如何通过cli命令打开新的终端窗口并打印“ Hello World”

时间:2019-10-15 16:32:45

标签: ubuntu gnome-terminal

对于一些次要的自动化,我一直在使用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.

2 个答案:

答案 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的公开错误:

https://bugzilla.gnome.org/show_bug.cgi?id=784925

答案 1 :(得分:0)

澄清 OP 中的问题,2 点:

  1. 为了

    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 而不是命令(单个可执行文件)。所以答案是:

  1. 使用“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仅内置(例如 readcd 与具有相应外部二进制文件的 shell 内置程序,例如 echosleep)。使用剩余的 作为参数(可能使用 exec(3),因为 system(3) 会识别 shell 语法)。-e 覆盖任何其他命令调用选项,即 ---x