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)