我有以下脚本:
#!/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
启动时会克隆自身。启动某个程序然后继续执行其他程序的正常方式是&
在后台启动它。