ima*_*ett 5 bash konsole gnome-terminal lxterminal xfce4-terminal
如果你输入这个简单的测试命令:
gnome-terminal -x bash -c "ls;sleep 3"
Run Code Online (Sandbox Code Playgroud)
您会发现它立即返回(新创建的终端,当然,逗留了三秒钟)。这与例如rxvt(相同的命令但带有e)形成对比。
如果你想要一个阻塞的开始,历史上的共识似乎是使用--disable-factory. 不幸的是,这不再起作用(在 3.14.2 中测试)。
那么,如何以非异步方式启动终端呢?
加分项:konsole,lxterminal,xfce4-terminal至少也有同样的问题。那些命令?
我使用的方法与 terdon 的答案有一些相似之处(并且是在他的帮助下创建的 - 谢谢@terdon!),但方法略有不同:
我创建了一个临时文件,以便子终端可以与父终端通信并告诉它相应的 bash 实例的 PID。然后我让父终端读取临时文件并记住 PID,删除该文件并继续每 100 毫秒(可以更改延迟)检查子终端的 bash 实例是否仍在运行。如果没有,终端将被手动关闭或因为命令完成而关闭。然后启动命令完成,父终端再次可用。
这种方法的优点:
将启动的所有命令(或这些命令的任何替代命令)都在负责检测终端关闭的命令之后ls; sleep 3执行。因此,如果内部命令挂起或者您在结束之前手动关闭终端,该机制仍然有效,并将继续执行外部脚本,而不是陷入无限循环。
带有调试输出的单行代码(子终端窗口打开后“启动”,关闭后“终止”)且精度为 0.1 秒:
pidfile=$(mktemp); gnome-terminal -x bash -c "echo \$$>$pidfile; ls; sleep 3"; until [ -s $pidfile ]; do sleep 0.1; done; terminalpid=$(cat "$pidfile"); rm $pidfile; echo "launched"; while ps -p $terminalpid > /dev/null 2>&1; do sleep 0.1; done; echo "terminated"
Run Code Online (Sandbox Code Playgroud)
或者没有调试输出:
pidfile=$(mktemp); gnome-terminal -x bash -c "echo \$$>$pidfile; ls; sleep 3"; until [ -s $pidfile ]; do sleep 0.1; done; terminalpid=$(cat "$pidfile"); rm $pidfile; while ps -p $terminalpid > /dev/null 2>&1; do sleep 0.1; done
Run Code Online (Sandbox Code Playgroud)
几乎相同的代码,但编写为 bash 脚本更加灵活:
#! /bin/bash
delay=0.1
pidfile=$(mktemp)
gnome-terminal -x bash -c "echo \$$>$pidfile; ls; sleep 3"
until [ -s $pidfile ]
do sleep $delay
done
terminalpid=$(cat "$pidfile")
rm $pidfile
echo "launched"
while ps -p $terminalpid > /dev/null 2>&1
do sleep $delay
done
echo "terminated"
Run Code Online (Sandbox Code Playgroud)
当然,您可以省略echo "launched"和行,如果您需要或多或少准确, echo "terminated"您也可以将该行更改为两次终端状态检查之间的另一个延迟(以秒为单位)。delay=0.1
要在子终端中执行另一个自定义命令,请替换该行
gnome-terminal -x bash -c "echo \$$>$pidfile; ls; sleep 3"
Run Code Online (Sandbox Code Playgroud)
与以下内容(插入您的命令而不是大写的占位符!)
gnome-terminal -x bash -c "echo \$$>$pidfile; INSERTYOURCOMMANDSHERE"
Run Code Online (Sandbox Code Playgroud)