是否可以扩展bash作业列表(作业命令)中的变量名称。例如。我得到了
等工作清单[1] Angehalten vi $file
[2] Angehalten vi $file
引用具有两个不同$ file值的vi会话。现在我想把带有特定文件的vi窗口带到前面,但不知道它有哪个作业号。
答案 0 :(得分:4)
您可以使用jobs -l
获取每个的PID,然后在ps
的输出中查找它们,这将显示扩展的字符串:
$ jobs -l
[2]- 6445 Suspended: 18 vi $file
[3]+ 6473 Suspended: 18 vi $file
$ ps | grep vi
6445 ttys000 0:00.03 vi x
6473 ttys000 0:00.03 vi y
6485 ttys000 0:00.00 grep --color vi
答案 1 :(得分:4)
以下命令应该有效(在ubuntu 11.10上使用bash 4.2.10测试)
paste <(jobs) <(jobs -p | xargs ps -p | tail -n+2 | awk '{print substr($0, index($0, $5))}')
输出:
[1] Stopped vi $A vi a
[2]- Stopped vi $A vi b
[3]+ Stopped vi $A vi c
这个想法与Carl's相同 - 按进程ID提取命令
答案 2 :(得分:0)
如果在执行命令之前可以尝试扩展变量。 也许有一种方法可以做到这一点,而无需写入文件。 如果不使用mktemp来启动临时文件。
cmd1=sleep
echo "$cmd1 10 &" > /tmp/veryscary.sh && source /tmp/veryscary.sh
答案 3 :(得分:0)
类似于Alex的答案,但没有所有的粘贴和子流程技巧。它适用于FreeBSD 10.0,使用bash v4.3.30
jobs -p | xargs ps -p |尾巴-n + 2 | awk'{print substr($ 0,index($ 0,$ 5))}'
答案 4 :(得分:0)
jobs -p | while read pid; do ps auxwq $pid; done | grep -v USER
答案 5 :(得分:0)
除了arj的答案但不需要临时文件外,怎么做:
cmd1=sleep
eval `echo "$cmd1 10 &"`