Xterm

終端仿真器是否總是通過 shell 間接執行程序?

  • November 29, 2018

終端仿真器是否總是通過 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 時,您的 shellfork() + 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,它使用PATHenv變數來查找這兩個命令,並意識到它確實是用分號分隔的兩個命令,xterm不要那樣做!

引用自:https://unix.stackexchange.com/questions/484548