コマンドを連結してファイルパスを指定しようとしています

コマンドを連結してファイルパスを指定しようとしています

複数のコマンドを連結してファイル パスを指定しようとしています。

これを実行する必要があります:

ls -l /proc/{PID}/fd/{FILE_NAME}

次のコマンドを実行すると PID を取得できます。

lsof | grep 'mysql\(.*\)deleted' | awk { print $2 }'

次のコマンドを実行するとファイル名を取得できます。

lsof | grep 'mysql\(.*\)deleted' | awk { print $10 } | cut -d'/' -f3

どちらも長いリストが表示されますが、これらを使用して ls コマンドのファイル パスを生成するにはどうすればよいでしょうか?

答え1

bash では配列を使用できます:

#!/bin/bash
pids=( $(lsof | grep 'mysql.*deleted' | awk '{ print $2 }') )
files=( $(lsof | grep 'mysql.*deleted' | awk '{ print $10 }' | cut -d/ -f3) )
for ((i=0; i<${#pids[@]}; i++)) ; do
    ls -l /proc/${pids[i]/fd/${files[i]}
done

もう 1 つの可能性としては、2 つのストリームから読み取ることが挙げられます。

while read pid ; do
    read file <&3
    ls -l /proc/$pid/fd$file
done < <(lsof | grep 'mysql.*deleted' | awk '{ print $2 }') \
     3< <(lsof | grep 'mysql.*deleted' | awk '{ print $10 }' | cut -d'/' -f3)

関連情報