
Ich wollte eine Funktion schreiben, um ein Feld aus der Liste der Hintergrundjobs in Bash abzurufen. Zum Beispiel, um ein bestimmtes Argument zu erhalten.
Nehmen wir an, ich schicke vim in den Hintergrund, sodass „Jobs“ diese Liste anzeigt:
[1]+ Stopped vim ~/.bashrc
Meine Funktion sieht folgendermaßen aus:
function jf {
echo `jobs | awk 'NR==$1{print $$2}'`;
}
Ich rufe es dann so auf:
jf 1 4
Ich möchte, dass die vierte Spalte der ersten Zeile zurückgegeben wird, also „~/.bashrc“, aber das passiert nicht. Was mache ich falsch?
Antwort1
Sie müssen angeben awk
, dass Sie Werte aus Shell-Variablen übergeben möchten. Etwas wie das Folgende in Ihrer Funktionsdefinition sollte genügen:
function jf {
echo `jobs | awk -v LINENO=$1 -v COLUMNNO=$2 'NR==LINENO {print $COLUMNNO}'`
}
Antwort2
Die einfachen Anführungszeichen führten dazu, dass Bash keine Argumente ersetzte. Wie Manatwork erwähnte, werden doppelte Anführungszeichen weniger streng interpretiert.
manatwork schrieb:
awk "NR==$1{print \$$2}"
Der Teil „echo `...`“ in meiner Funktion war immer noch ein Problem, aber anscheinend habe ich die Dinge zu kompliziert gemacht und es ist überhaupt nicht nötig. Diese neue Funktion funktioniert für mich:
function jf {
jobs | awk "NR==$1{print \$$2}";
}