Wie kann ich eine solche Liste über die Befehlszeile abrufen, einschließlich der Version jedes Dienstprogramms? Befinden sie sich standardmäßig zufällig in derselben Datei?
Antwort1
Sie sind [wahrscheinlich] trotzdem ( gold
hat eine zusätzliche Version – siehe das Ende dieses Beitrags).
Aber beachten Sie den Rest dieser Antwort Code-Golf, um die beste Möglichkeit zum Extrahieren der Versionen zu finden.
dpkg -L binutils | grep "/usr/bin/" | xargs -i sh -c "{} --version"
Macht so ziemlich das Gleiche wie roadmr.
dpkg -L binutils | xargs -i sh -c "{} --version 2>/dev/null || exit 0"
Versucht zu rennenalles dpkg -L ...
Ausgaben. Offensichtlich werden nur die ausführbaren Dateien ausgeführt, also müssen wir nur Fehler umleiten (und xargs
sie ignorieren).
dpkg -L binutils | xargs -i bash -c '[[ -x "{}" && -f "{}" ]] && {} --version'
Testen Sie, ob es sich um eine ausführbare Datei und nicht um einen Filterpfad handelt.
sudo apt-get install parallel
dpkg -L binutils | grep /usr/bin/ | parallel {} --version
dpkg -L binutils | parallel {} --version 2>/dev/null
dpkg -L binutils | parallel '[[ -x "{}" && -f "{}" ]] && {} --version'
Dieses Mal verwenden wir GNU, parallel
um dieselben Ansätze zu verfolgen. parallel
Ermöglicht uns, bestimmte Unannehmlichkeiten zu überspringen xargs
(z. B. die Unfähigkeit, einen Exitcode ungleich Null zu überspringen. man parallel
Ist eine wirklich interessante Lektüre.
Abgesehen davon sind alle meine Beispiele zwar kürzer, werden aber in eine neue Shell verzweigt (was bei unvermeidlich ist xargs
und auch der Sinn von ist parallel
), sodass sie alle etwas langsamer sind als die von roadmr. Das erste ist das schnellste.
Bearbeiten:Bis jetzt...
sh <(dpkg -L binutils | awk '/bin\// {print $0 " --version"}')
Nur zwei Gabeln (sozusagen) und es istalsschnell wie die For-Schleife (und trotzdem viel kürzer).
Bearbeiten: Sie sind eigentlich nicht ganz gleich. gold
hat eine sekundäre Version (1.11), die bei den anderen Befehlen nicht vorhanden ist.
$ sh <(dpkg -L binutils | awk '/bin\// {print $0 " --version"}') | \
grep Binutils | sort -u | column -t
GNU addr2line (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU ar (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU assembler (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU c++filt (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU dwp (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU elfedit (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU gold (GNU Binutils for Ubuntu 2.23.52.20130913) 1.11
GNU gprof (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU ld (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU nm (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU objcopy (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU objdump (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU ranlib (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU readelf (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU size (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU strings (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU strip (GNU Binutils for Ubuntu) 2.23.52.20130913
Antwort2
Versuche dies:
for util in `dpkg --listfiles binutils |grep "\/usr\/bin\/"`; do
echo -n "$util -> "; echo "" | $util --version
done
Dadurch werden alle Binärdateien in den Binutils-Paketen abgerufen und jede mit ihrem Parameter --version abgefragt. Für diejenigen, die eine Eingabe im Terminal erwarten, gebe ich eine leere Zeichenfolge aus.