Ubuntu 如何从cli命令打开新的终端窗口并打印;“你好,世界”;

Ubuntu 如何从cli命令打开新的终端窗口并打印;“你好,世界”;,ubuntu,gnome-terminal,Ubuntu,Gnome Terminal,我一直在玩gnome终端命令的一些小自动化,我一直遇到同样的问题。目标是在与当前窗口相同的目录中打开一个新窗口,并执行一个简单的命令(即echo、cd或类似命令)。此命令似乎可以在同一目录中打开新窗口: DIR=$(pwd); gnome-terminal --working-directory=$DIR 但是,当我向其添加执行时,它会失败: DIR=$(pwd); gnome-terminal --working-directory=$DIR -e 'echo "test"' 我收到一条消

我一直在玩gnome终端命令的一些小自动化,我一直遇到同样的问题。目标是在与当前窗口相同的目录中打开一个新窗口,并执行一个简单的命令(即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"'
但是,我现在收到此错误:

未能执行子进程“echo”test”“(没有这样的文件或目录)

有人知道为什么会这样吗

准确的系统规格: Ubuntu 18.04,GNOME终端3.32.1,使用VTE 0.56.2+GNUTLS

确切的弃用信息是:

#选项“-e”已弃用,可能会在以后版本的gnome终端中删除。

# Use “-- ” to terminate the options and put the command line to execute after it.

啊。我懂了。这两条信息实际上是截然不同的

# 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终端的选项之一,而是要在终端内部运行的命令行参数

我想一个例子可能会让这更清楚

gnome-terminal -x -- grep -v "42" hitchikers_guide_to_the_galaxy.txt
这将打开一个gnome终端。在终端内部,我们运行grep,不包括任何包含字符串“42”的行。如果我们没有使用
--
,gnome终端会将
-v
视为
gnome终端的命令行参数,并且可能会抛出一条警告,指出
-v
不是gnome终端的有效参数

编辑:

好的,所以
-x
-c
都不推荐使用。您可以执行不带任何标志的命令。它确实需要使用
--
来终止所有其他选项。。。所以我说的每句话都大错特错了。这个理由是可靠的,只是错了

gnome-terminal -- nano
将打开一个新的终端,并在终端内部启动nano

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

gnome-terminal -- echo foo
它运行,但它退出的速度太快,以至于你在屏幕上除了一个闪光灯之外什么都看不到

请注意,
-c
的弃用还有一个公开的bug:


为了澄清OP中的问题,有两点:

  • 为了

    DIR=$(pwd); gnome-terminal --working-directory=$DIR -- 'echo "test"'
    
  • (无法解释的)错误表示“命令”无效

    i、 e.它正在尝试运行存储在名为
    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终端的参数列表。
    sleep5
    是在(不做任何事)
    gnome终端之后执行的一个单独命令。试图引用;无效:

    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" ; echo Press ENTER to continue ; read a'
    
    另外,对于书呆子,我知道周围的空间;另外,我使用了泛型的
    sh
    来表示目标系统上使用的任何版本(并假设
    -c
    与Bourne shell中一样工作)。此外,shell变量(
    DIR
    在示例中)是冗余的,只需使用
    --working directory=$(pwd)
    ,除非您想在后续命令(行)中再次使用该值。事实上,在我的测试中,
    gnome terminal
    在调用进程的当前目录中启动,因此
    --工作目录
    在这里几乎肯定是多余的。最后,问题是要打印“Hello World”,所以正确答案(增加延迟)是:

    p.p.S.在测试(不推荐的)
    -e
    -x
    选项时,注意到以下内容(V3.28.2):

    • -x
      --
      具有相同的效果,进一步的参数处理仍然被禁止。这可能解释了“奇数”错误

    因为它正在尝试执行命令
    -->
    (在我的测试中没有得到这个确切的错误,只有标准的
    “--”没有这样的文件或目录

    • -e
      将其参数作为命令行调用,但不作为sh(1)输入。该参数被解析为空白边界(测试空格、制表符和换行符)处的单词,允许\(引用单个字符包括空白)和“and”(引用封闭字符串,没有观察到的差异)。第一个单词是命令名。它必须是指向可执行文件的路径(绝对、相对或
      $path
      可查找),而不是仅限shell的内置文件(例如
      读取
      cd
      与具有相应外部二进制文件的shell内置文件,例如
      回送
      休眠
      )。使用剩余的单词作为参数(probab)调用该命令
      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'
      
      gnome-terminal -- sh -c 'echo Hello World;sleep 5'
      
      #_g_io_module_get_default: Found default implementation gvfs (GDaemonVfs) for ‘gio-vfs’