终端仿真器是否总是通过 shell 间接执行程序?
例如,当我们打开一个终端仿真器窗口时,它会自动执行一个 shell,而我们只能在 shell 中键入命令。
例如,当直接在终端仿真器上运行程序时,例如
xterm -e "echo hello; sleep 5"
xterm
是通过 shell 间接执行程序,还是不使用 shell 直接执行程序?
终端仿真器是否总是通过 shell 间接执行程序?
例如,当我们打开一个终端仿真器窗口时,它会自动执行一个 shell,而我们只能在 shell 中键入命令。
例如,当直接在终端仿真器上运行程序时,例如
xterm -e "echo hello; sleep 5"
xterm
是通过 shell 间接执行程序,还是不使用 shell 直接执行程序?
这取决于终端仿真器。
xterm
将首先execvp(2)
使用给定的参数调用-e
,但如果失败并且后面有一个command
参数-e
,它也会尝试$SHELL -c command
。mlterm
如果失败,rxvt
只会出错execvp
。如果我的第二段没有说服你,你可以试试这个:
或者看源码。
在您的示例中,使用该
-e
选项,然后xterm
将启动一个 shell,手册说明了这一点。可以覆盖 xterm 对 shell 的默认搜索,因此您可以为此提供自己的程序,但是当您覆盖 shell 时,您不能使用 -e 选项。当您覆盖 shell 时,您的 shell
fork() + exec()
将由 xterm 直接运行 ( )。以下是相关部分,
和
看看你正在执行什么,
解析那个字符串的是shell,它使用
PATH
env变量来查找这两个命令,并意识到它确实是用分号分隔的两个命令,xterm
不要那样做!根据手册,您可以使用参数禁用登录外壳
+ls
:所以
xterm -e "echo hello"
产生一个shell,但xterm +ls -e "echo hello"
没有。