2012-03-22 65 views
1

是否可以在bash作業列表(作業命令)中展開變量名稱。例如。我得到的工作清單如如何在bash作業列表中展開變量

[1] Angehalten    vi $file 
[2] Angehalten    vi $file 

它指的是具有兩個不同的$ file值的會話。現在我想把帶有特定文件的vi窗口放在前面,但不知道它有哪個作業編號。

回答

0

與Alex的答案類似,但沒有所有粘貼和子過程技巧。它適用於FreeBSD 10.0上的bash v4.3.30

作業-p | xargs ps -p | tail -n + 2 | awk'{print substr($ 0,index($ 0,$ 5))}''

+0

如果你想保留工作#s,該怎麼辦? – Asher 2015-10-28 19:34:24

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 
4

下面的命令,就可以(在bash 4.2測試。 10 ubuntu上11.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相同 - 通過進程標識提取命令

+0

看起來不錯,但是由於某些原因,如果我把這行放到bash腳本文件中,它不起作用。 – highsciguy 2012-03-22 22:59:25

+0

它作爲.bashrc中的函數工作,但前提是後臺中有多個進程。 – highsciguy 2012-03-22 23:07:08

+0

這是因爲腳本運行在一個單獨的子shell中,顯然,它沒有與當前shell相同的'jobs'列表。是否有一個原因,你不想用它作爲一個函數? – tripleee 2013-07-23 03:48:49

0

如果您可以在執行命令之前嘗試擴展變量。 也許有這樣做的方式,而不需要寫入文件。 如果不使用mktemp啓動臨時文件。

cmd1=sleep 
echo "$cmd1 10 &" > /tmp/veryscary.sh && source /tmp/veryscary.sh 
0
jobs -p | while read pid; do ps auxwq $pid; done | grep -v USER 
+0

我幾乎100%肯定你正在給指定Linux系統的人提供BSD風格選項。 – 2016-04-15 17:17:59

+1

如果你指的是選項「auxw」到「ps」,那麼...... nope,這些選項在linux中工作。據我所知,他們實際上在linux/* bsd/osx/cygwin /(也許是其他人)中「工作」,這就是爲什麼我使用它們,並且我把它們全部用於簡單的習慣。我引用了「工作」,因爲可能有些標誌在某些平臺上被忽略。至於cygwin,你必須使用'-p '而不是'-q ' – 2016-04-15 21:36:31

+0

那麼,他們肯定不會在Ubuntu上工作。 'dhoelzer @ MON-01:〜$ ps auxwq' '錯誤:不支持的選項(BSD語法)' – 2016-04-15 22:09:55