Versuch, Befehle zu verketten, um einen Dateipfad zu erhalten

Versuch, Befehle zu verketten, um einen Dateipfad zu erhalten

Ich versuche, mehrere Befehle zu verketten, um einen Dateipfad zu erhalten.

Ich muss dies ausführen:

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

Ich kann die PID abrufen, indem ich Folgendes ausführe:

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

Und ich kann den Dateinamen abrufen, indem ich Folgendes ausführe:

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

Beide geben mir schöne lange Listen, aber wie kann ich sie verwenden, um den Dateipfad für den Befehl ls zu generieren?

Antwort1

In Bash können Sie Arrays verwenden:

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

Eine andere Möglichkeit wäre, aus zwei Streams zu lesen:

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)

verwandte Informationen