tentando concatenar comandos para fornecer um caminho de arquivo

0

Estou tentando concatenar vários comandos para fornecer um caminho de arquivo.

Eu preciso executar isso:

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

Eu posso pegar o PID executando:

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

E posso obter o nome do arquivo executando:

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

Ambos fornecem listas longas, mas como posso usá-las para gerar o caminho do arquivo para o comando ls?

    
por Chris 29.01.2016 / 14:52

1 resposta

3

No bash, você pode usar matrizes:

#!/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

Outra possibilidade seria ler de dois fluxos:

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)
    
por 29.01.2016 / 15:08