我正在尝试从我的 WM 创建一个非常简单的穷人“运行盒”/程序启动器。
从我的菜单中我有;
"Run" f.exec "xterm -fg black -bg white -geometry 25x1 -T Run -e 'read input && exec $input' &"
虽然这创建了一个漂亮的小运行对话框,它接受用户输入,但它在子程序运行时保持运行 - 当它应该立即退出时,子进程启动。
最初这似乎是一个简单的想法,但现在看起来比我的脚本 fu 提供的要困难得多。有小费吗?
编辑:我想我会回来并发布我最后所做的事情,以防万一有人试图做类似的事情。
来自 .twmrc 中 TWM 的菜单部分
"Command" !"xterm -fg dimgrey -bg white -geometry 25x1+840+1150 -name run -title Run -e ~/scripts/getrun &"
以及getrun的内容
read -p "# " userinput
nohup $userinput >/dev/null 2>&1 &
PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
答案1
我认为&
根据问题的描述,命令行的末尾不是您想要的。在本例中,您将 xterm 置于后台并保持脚本运行,但在 xterm 之后没有任何内容可运行。您可能想将&
结束引号放在执行逗号内。然而,我不能保证它会起作用,因为我不确定 xterm 的行为和参数以及 TWM 的工作原理。如果它不起作用,我将展示一个如何在标准 shell 中执行此操作的示例,该示例可能可以通过单独的脚本重现到您使用它的上下文中。
作为如何测试和实现它的示例,我在/tmp/
目录中创建了两个脚本。第一个runbg.sh
包含预期的功能:
#!/bin/sh
read cmdline
$cmdline &
第二个脚本,/tmp/infiniteloop.sh
是一种测试它是否按预期工作的方法,它是一个无限循环,带有一个休眠计时器,每次迭代都会将当前日期附加到文件中/tmp/infiniteloop.tmp
。
#!/bin/sh
while true; do
date >> /tmp/infiniteloop.tmp
sleep 30
done
如果您随后运行/tmp/runbg.sh
并键入命令/tmp/infiniteloop.sh
,它会让您返回 shell。您可以infiniteloop.sh
通过 a 检查脚本是否仍在运行tail -f /tmp/infiniteloop.tmp
,如果您所做的一切正确,它将每 30 秒向您显示一个包含当前日期的新行。
因此,对于您的情况,我的建议是编写一个单独的 shell 脚本来读取命令并在后台运行它,然后在 TWM 菜单配置文件中调用该脚本。