![终端仿真器是否总是通过 shell 间接执行程序?](https://linux22.com/image/142710/%E7%BB%88%E7%AB%AF%E4%BB%BF%E7%9C%9F%E5%99%A8%E6%98%AF%E5%90%A6%E6%80%BB%E6%98%AF%E9%80%9A%E8%BF%87%20shell%20%E9%97%B4%E6%8E%A5%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
终端仿真器是否总是通过 shell 间接执行程序?
例如,当我们打开终端仿真器窗口时,它会自动执行一个shell,而我们只能在shell中输入命令。
例如,直接在终端仿真器上运行程序时,如
xterm -e "echo hello; sleep 5"
是xterm
通过 shell 间接执行程序,还是不使用 shell 直接执行程序?
答案1
这取决于终端模拟器。
xterm
将首先execvp(2)
使用给定的参数进行调用-e
,但如果失败并且后面有一个command
参数-e
,它也会尝试$SHELL -c command
。
mlterm
如果失败就会rxvt
出错execvp
。
如果我的第二段没有说服你,你可以试试这个:
$ mkdir /tmp/tbin; ln -s /usr/bin/vi '/tmp/tbin/echo hello; sleep 5'
$ PATH=$PATH:/tmp/tbin xterm -e 'echo hello; sleep 5'
或者看看来源。
答案2
在您的示例中,使用该-e
选项,然后xterm
将启动一个外壳,手册中对此进行了说明。
可以覆盖 xterm 对 shell 的默认搜索,因此您可以为此提供自己的程序,但是当您覆盖 shell 时,您不能使用 -e 选项。当你重写 shell 时,你的外壳由 xterm 直接运行 ( fork() + exec()
)。
以下是相关部分,
One parameter (after all options) may be given. That overrides xterm's built-in choice of
shell program. Normally xterm checks the SHELL variable. If that is not set, xterm tries
to use the shell program specified in the password file. If that is not set, xterm uses
/bin/sh. If the parameter is not a relative path, i.e., beginning with “./” or “../”, xterm
looks for the file in the user's PATH. In either case, it constructs an absolute path. The
-e option cannot be used with this parameter since it uses all parameters following the
option.
和
-e program [ arguments ... ]
This option specifies the program (and its command line arguments) to be run in the
xterm window. It also sets the window title and icon name to be the basename of the
program being executed if neither -T nor -n are given on the command line. This
must be the last option on the command line.
只要看看你正在执行什么,
"echo hello; sleep 5"
shell 解析该字符串,它使用PATH
env 变量来查找这两个命令,并意识到它确实是用分号分隔的两个命令,但xterm
不这样做!
答案3
根据手册,您可以使用参数禁用登录shell +ls
:
+ls This option indicates that the shell that is started should not be a login shell (i.e., it will be a normal “subshell”).
因此xterm -e "echo hello"
会产生一个外壳,但xterm +ls -e "echo hello"
不会。