【问题标题】:How can I open a new terminal window from a cli command and print "Hello World"如何从 cli 命令打开一个新的终端窗口并打印“Hello World”
【发布时间】:2019-10-15 16:32:45
【问题描述】:

我一直在使用 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.

【问题讨论】:

  • 弃用警告的确切文本是什么?另外,您使用的是哪个版本的gnome-terminal
  • 嗨,巴顿,感谢您的反馈。我已经用您要求的信息更新了问题。如果还有什么可以补充的,请告诉我。

标签: ubuntu gnome-terminal


【解决方案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.

这是命令行程序中使用的约定。两个破折号表示之后出现的任何内容,无论是否有破折号,都不是命令行选项。它与-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-terminal 的有效参数。

编辑:

好的,所以 -x-c 都已弃用。你可以在没有任何标志的情况下执行命令。它确实需要使用-- 来终止所有其他选项......所以我对我所说的一切都大错特错。理由很充分,只是错了。

gnome-terminal -- nano

将打开一个新终端,并在终端内启动 nano。

当你尝试时,事情会变得很棘手

gnome-terminal -- echo foo

它会运行,但退出速度太快,以至于您在屏幕上只看到一个闪光。

请注意,还有一个关于弃用-c 的开放错误:

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

【讨论】:

  • 读到这篇文章我真的很兴奋,因为你描述它的方式似乎很有意义,但我仍然收到一个错误:DIR=$(pwd); gnome-terminal --working-directory=$DIR -x -- echo "test" # Option “-x” 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. # _g_io_module_get_default: Found default implementation gvfs (GDaemonVfs) for ‘gio-vfs’
  • 嗯.. Re: 编辑,我明白你的意思了。呜呜呜。甚至 gnome-terminal -- ls 似乎也破坏了它
【解决方案2】:

为了澄清 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'

附:对于学究,我知道周围的空间;和 " around (单字) 测试是不必要的。此外,我使用通用 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 将其参数作为命令行调用 BUT 而不是 sh(1) 输入。参数在空格边界(测试空格、制表符和换行符)处被解析为 words,允许 \(引用单个字符,包括空格)和 " 和 '(引号括起来的字符串,未观察到区别)。第一个单词是命令名。它必须是可执行文件的路径(绝对、相对或$PATH可查找),NOT仅构建的shell -in(例如 readcd 与具有相应外部二进制文件的 shell 内置程序,例如 echosleep)。使用剩余的 words 调用命令参数(可能使用exec(3),因为system(3) 会识别shell 语法)。-e 覆盖任何其他命令调用选项,即---x

【讨论】:

    猜你喜欢
    • 2013-12-25
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多