如何在bash作业列表中扩展变量

时间:2012-03-22 17:29:03

标签: linux bash shell

是否可以扩展bash作业列表(作业命令)中的变量名称。例如。我得到了

等工作清单
[1]   Angehalten              vi $file
[2]   Angehalten              vi $file

引用具有两个不同$ file值的vi会话。现在我想把带有特定文件的vi窗口带到前面,但不知道它有哪个作业号。

6 个答案:

答案 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 &"`