Xterm
終端仿真器是否總是通過 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
。如果我的第二段沒有說服你,你可以試試這個:
$ mkdir /tmp/tbin; ln -s /usr/bin/vi '/tmp/tbin/echo hello; sleep 5' $ PATH=$PATH:/tmp/tbin xterm -e 'echo hello; sleep 5'
或者看源碼。
在您的範例中,使用該
-e
選項,然後xterm
將啟動一個 shell,手冊說明了這一點。可以覆蓋 xterm 對 shell 的預設搜尋,因此您可以為此提供自己的程序,但是當您覆蓋 shell 時,您不能使用 -e 選項。當您覆蓋 shell 時,您的 shell
fork() + exec()
將由 xterm 直接執行 ( )。以下是相關部分,
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
不要那樣做!