Ubuntu 如何从cli命令打开新的终端窗口并打印;“你好,世界”;
我一直在玩gnome终端命令的一些小自动化,我一直遇到同样的问题。目标是在与当前窗口相同的目录中打开一个新窗口,并执行一个简单的命令(即echo、cd或类似命令)。此命令似乎可以在同一目录中打开新窗口: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"' 我收到一条消
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’