
bash のバックグラウンド ジョブのリストからフィールドを取得する関数を書きたいと考えていました。たとえば、特定の引数を取得する場合などです。
vim をバックグラウンドに送信すると、「jobs」に次のリストが表示されます。
[1]+ Stopped vim ~/.bashrc
私の関数は次のようになります:
function jf {
echo `jobs | awk 'NR==$1{print $$2}'`;
}
私は次のように呼び出します:
jf 1 4
1 行目の 4 列目 (「~/.bashrc」) を返すようにしたいのですが、返されません。何が間違っているのでしょうか?
答え1
awk
シェル変数から値を渡す必要があることを伝えます。関数定義に次のように記述すればうまくいきます。
function jf {
echo `jobs | awk -v LINENO=$1 -v COLUMNNO=$2 'NR==LINENO {print $COLUMNNO}'`
}
答え2
一重引用符により、bash は引数を置換しなくなりました。manatwork が述べたように、二重引用符はそれほど厳密に解釈されません。
manatwork は次のように書いています:
awk "NR==$1{print \$$2}"
それでも、私の関数の「echo `...`」の部分は問題を引き起こしましたが、物事を複雑にしすぎたようで、まったく必要ありませんでした。この新しい関数は私の場合はうまく機能します。
function jf {
jobs | awk "NR==$1{print \$$2}";
}