bash 中的 xterm 停止脚本执行

bash 中的 xterm 停止脚本执行

我有以下脚本:

#!/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 时没有任何问题。

答案1

如果你希望脚本运行命令然后继续执行,则需要在后台调整该命令(&,请参阅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,如下所述man clone

   clone() creates a new process, in a manner similar to fork(2).

因此,与大多数程序不同,gnome-terminal启动时会克隆自身。启动某个程序然后继续执行其他程序的正常方式是&在后台启动它。

相关内容