터미널 에뮬레이터는 항상 셸을 통해 간접적으로 프로그램을 실행합니까?
예를 들어 터미널 에뮬레이터 창을 열면 자동으로 셸이 실행되고 셸에는 명령만 입력할 수 있습니다.
예를 들어 다음과 같이 터미널 에뮬레이터에서 직접 프로그램을 실행할 때
xterm -e "echo hello; sleep 5"
xterm
프로그램이 셸을 통해 간접적으로 실행됩니까, 아니면 셸을 사용하지 않고 직접 실행됩니까 ?
답변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의 기본 검색을 무시할 수 있으므로 이에 대한 자신만의 프로그램을 제공할 수 있지만 쉘을 무시할 때 -e 옵션을 사용할 수는 없습니다. 쉘을 다시 작성할 때,너의 껍질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"
쉘은 문자열을 구문 분석하고 PATH
env 변수를 사용하여 두 명령을 찾은 다음 실제로 세미콜론으로 구분된 두 명령임을 인식하지만 xterm
그렇지 않습니다!
답변3
매뉴얼에 따르면 다음 매개변수를 사용하여 로그인 쉘을 비활성화할 수 있습니다 +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"
그렇지 않습니다.