2012-03-22 13 views
1

bashジョブリスト(jobsコマンド)の変数名を展開することは可能ですか?例えば。bashジョブリストで変数を展開する方法

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

などのジョブリストは、2つの異なる$ fileの値を持つviセッションを参照しています。今、特定のファイルを持つviウィンドウを前面に持っていきたいのですが、どのジョブ番号を持っているのか分かりません。

答えて

0

アレックスの答えに似ていますが、すべてのペーストとサブプロセスのトリックはありません。 FreeBSD 10.0でbash v4.3.30で動作しました

jobs -p | xargs ps -p |テール-n + 2 | awkの{印刷SUBSTR($ 0インデックス($ 0、$ 5))} '

+0

ジョブ#を保持したい場合はどうすればいいですか? – Asher

4

あなたはそれぞれのPIDを取得するためにjobs -lを使用して、拡張された文字列が表示されます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でテスト。 Ubuntuの11.10)で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でコマンドを抽出してください

+0

はよさそうだが、私はbashスクリプトファイルにラインを入れた場合、何らかの理由でそれが動作しません。 – highsciguy

+0

これは.bashrcの関数として機能しますが、バックグラウンドに複数のプロセスがある場合に限ります。 – highsciguy

+0

これは、スクリプトが別のサブシェルで実行されているためです(明らかに、現在のシェルと同じ 'jobs'リストを持たない)。それを関数として使用したくない理由はありますか? – tripleee

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

Linuxシステムを指定した人にBSDスタイルのオプションを与えることは、ほぼ100%確信しています。 –

+1

オプション "auxw"〜 "ps"を参照している場合は、これらのオプションはlinuxで動作します。私が知っている限り、彼らは実際にはlinux/* bsd/osx/cygwin /(多分他の人ですか?)で働いているので、私はそれらを使うのですが、それらをすべて単純な習慣から除外しました。私は "仕事"を引用しました。なぜなら、これらのフラグのいくつかは、一部のプラットフォームでは無視されているにすぎないからです。 cygwinの場合は、 '-q 'の代わりに '-p 'を使用する必要があります。 –

+0

Ubuntuでは動作しません。 'dhoelzer @ MON-01:〜$ ps auxwq' 'エラー:サポートされないオプション(BSD構文) ' –

関連する問題