user1616685 Asked: 2019-02-06 07:24:42 +0800 CST2019-02-06 07:24:42 +0800 CST 2019-02-06 07:24:42 +0800 CST bash 中的 xterm 停止执行脚本 772 我有以下脚本: #!/bin/bash xterm -e ' sh -c "$HOME/TEST/FirstAPP --test;" exec bash' ## script opens the xterm and stops until I press CTRL+C while true; do .... 这个问题与这个问题有关 为什么脚本会停在这个地方?我需要调用并运行 xterm,然后继续运行 FirstApp 的代码。 我使用 gnome-terminal 没有问题。 scripts bash xterm 1 个回答 Voted Best Answer terdon 2019-02-06T08:21:52+08:002019-02-06T08:21:52+08:00 如果您希望脚本运行命令然后继续执行,则需要在后台调整命令(&参见https://unix.stackexchange.com/a/159514/22222)。因此,将脚本更改为: #!/bin/bash xterm -e 'sh -c "$HOME/TEST/FirstAPP --test;"' & ## script opens the xterm and stops until I press CTRL+C while true; do .... 这将xterm在后台启动命令,保持终端打开并FirstAPP运行,然后继续执行脚本的其他行。 它使用的原因gnome-terminal是因为当您运行时gnome-terminal,它显然会分叉自己并将控制权返回给您启动它的 shell。你可以看到这个strace: $ strace -e clone gnome-terminal clone(child_stack=0x7fef6e44db30, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fef6e44e9d0, tls=0x7fef6e44e700, child_tidptr=0x7fef6e44e9d0) = 9534 clone(child_stack=0x7fef6dc4cb30, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fef6dc4d9d0, tls=0x7fef6dc4d700, child_tidptr=0x7fef6dc4d9d0) = 9535 # watch_fast: "/org/gnome/terminal/legacy/" (establishing: 0, active: 0) clone(child_stack=0x7fef6d391b30, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fef6d3929d0, tls=0x7fef6d392700, child_tidptr=0x7fef6d3929d0) = 9540 # unwatch_fast: "/org/gnome/terminal/legacy/" (active: 0, establishing: 1) # watch_established: "/org/gnome/terminal/legacy/" (establishing: 0) +++ exited with 0 +++ 请注意对 which 的调用clone,如 do 中所述man clone: clone() creates a new process, in a manner similar to fork(2). 因此,与大多数程序不同,gnome-terminal它会在启动时克隆自身。启动某些内容然后继续执行其他内容的正常方式是使用&在后台启动它。
如果您希望脚本运行命令然后继续执行,则需要在后台调整命令(
&
参见https://unix.stackexchange.com/a/159514/22222)。因此,将脚本更改为:这将
xterm
在后台启动命令,保持终端打开并FirstAPP
运行,然后继续执行脚本的其他行。它使用的原因
gnome-terminal
是因为当您运行时gnome-terminal
,它显然会分叉自己并将控制权返回给您启动它的 shell。你可以看到这个strace
:请注意对 which 的调用
clone
,如 do 中所述man clone
:因此,与大多数程序不同,
gnome-terminal
它会在启动时克隆自身。启动某些内容然后继续执行其他内容的正常方式是使用&
在后台启动它。