Immer eine Prozess-ID & Zuweisung einer Variablen in einem Bash-Skript
Habe ich eine interessante situation. Den gesamten code hier ist eine funktionale pseudo-code-Beispiel für das genaue Problem, das ich mich vor so keine Witze über weisen Sie den Ausgang des date
. Will ich eigentlich erfassen Sie die Ausgabe von einem langsameren mehr Ressourcen abhängige Funktion, aber date
gut funktioniert zu zeigen, die funktionale Hindernis habe ich laufen.
Ich Schreibe bash-Skript, wo will ich weisen Sie den Ausgang eines Prozesses auf eine variable wie so:
RESPONSE=$(nice -n 19 date);
Nun, das gibt mir die RESPONSE
in einem netten variable, richtig? Okay, was ist, wenn ich will, um die Prozess-ID der Funktion, die aufgerufen wird, innerhalb $()
? Wie soll ich das tun? Ich nahm an, das würde funktionieren:
RESPONSE=$(nice -n 19 date & PID=(`jobs -l | awk '{print $2}'`));
Die macht gib mir die Prozess-ID in die variable PID
, aber dann habe ich nicht mehr die Ausgabe an RESPONSE
.
Den code, den ich verwende als funktionales Beispiel ist dies. Dieses Beispiel funktioniert, aber keine PID
; ja, ich bin nicht die Zuordnung einer PID
aber das ist wieder ein Beispiel:
RESPONSE=$(nice -n 19 date);
wait ${PID};
echo "${RESPONSE}";
echo "${PID}";
Diesem Beispiel gibt mir eine PID
aber keine RESPONSE
:
RESPONSE=$(nice -n 19 date & PID=(`jobs -l | awk '{print $2}'`));
wait ${PID};
echo "${RESPONSE}";
echo "${PID}";
Jemand wissen, wie kann ich den Wert von RESPONSE
mit der PID
auch?
- Das sieht für mich wie Sie haben zu entscheiden, WIE etwas zu tun, aber etwas ist nicht ersichtlich. Wir brauchen eine Beschreibung von dem, was Sie tun müssen, nicht, wie Sie dachte, Sie sollten es tun. Davon ausgehen, dass jemand hier bereits weiß, wie zu tun, was Sie wirklich wollen, nicht das, was Sie uns sagen, dass Sie denken, Sie tun sollten.... also, wenn Sie uns sagen, dann werden Sie eine Antwort bekommen, die funktioniert. Wo wir jetzt sind, ist nicht hilft Ihnen überhaupt.
- Jim, ich möchte, genau das zu tun, was das Skript zeigt. Ich möchte die Prozess ID & dann haben Sie das Skript warten, um diesen Prozess zu beenden, bevor Sie den nächsten Schritt. Aber—wenn das, was Luis sagt, wahr ist,—dann vielleicht einfach das einwickeln der Funktion in
$()
ist genug, um sicherzustellen, dass die nächsten Schritte nicht auftreten, bis eine variable zugewiesen wird?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abhängig, wie genau Sie es einrichten, mit
RESPONSE=$(backgroundcommand)
wird entweder warten, bis der Befehl abgeschlossen ist (in welchem Fall es ist zu spät, um seine PID), oder nicht warten Sie, bis der Befehl abgeschlossen ist (in dem Fall ist seine Ausgabe nicht vorhanden ist, und dies kann nicht zugeordnet werden-ANTWORT). Sie gehen zu müssen, speichern Sie die Ausgabe des Befehls an anderer Stelle (wie eine temporäre Datei), und dann sammeln Sie, wenn der Prozess abgeschlossen ist:(Beachten Sie, dass die
$(<$responsefile)
Konstrukt ist nur in bash, nicht im nur-posix-shells. Wenn Sie nicht starten Sie das Skript mit#!/bin/bash
verwenden$(cat $responsefile)
statt.)Diese noch nicht ganz das, was du suchst, denn (zumindest so weit ich das sehen kann), was du suchst, nicht wirklich sinnvoll. Das Kommando der PID und der Ausgang nie zur gleichen Zeit existieren, so bekommen beide nicht wirklich aussagekräftig. Das Skript gab ich oben technisch gibt Sie beide, aber die pid ist, ist irrelevant (der Prozess existiert) zu der Zeit als Reaktion zugewiesen bekommt, also, während Sie haben die pid am Ende, es ist sinnlos.