Warum funktioniert der Befehl „Jobs“ nicht im Shell-Skript?

Warum funktioniert der Befehl „Jobs“ nicht im Shell-Skript?

Wenn ich es jobs -lin der Eingabeaufforderung ausführe, wird mir der Status laufender Jobs angezeigt. Wenn ich es jedoch unter der Datei ./tmp.sh ausführe,

#! /bin/bash
jobs -l

Es wird eine leere Ausgabe angezeigt.

Warum ist das so und wie kann ich in einem Shell-Skript Informationen zum Status eines bestimmten Jobs abrufen?

Antwort1

jobs

zeigt die Arbeitsplätzeverwaltet von der aktuellen Shell. Ihr Skript wird in seiner eigenen Shell ausgeführt, daher jobswerden nur Jobs angezeigt, die von der Shell des Skripts verwaltet werden ...

Um dies in Aktion zu sehen, führen Sie aus

#!/bin/bash
sleep 60 &
jobs -l

Um Informationen zu „Jobs“ anzuzeigen, die vor einem Shell-Skript gestartet wurden, müssen Sie diese innerhalb des Skripts wie normale Prozesse behandeln und verwenden psusw. Sie können sich auf Prozesse beschränken, die von der übergeordneten Shell gestartet wurden (die Shell, von der aus das Skript gestartet wurde, sofern vorhanden), indem Sie die $PPIDVariable innerhalb des Skripts verwenden und nach Prozessen suchen, die dieselbe übergeordnete PID verwenden.

Antwort2

Wie Stephen schon sagte, ist das Erzeugen einer neuen Shell wahrscheinlich nicht das, was Sie tun möchten. Sie müssen den Code imaktuelle Shell.

Ihr Code würde funktionieren, indem source myscript.sher entweder ausgeführt oder in einemFunktion(diese könnte sich in Ihrer Bashrc-Datei oder in einer separaten Datei mit Bezug auf die Quelle befinden).

myfunction () {
  jobs -l
} 

Ich habe dies inmeine Dotfiles, wenn Sie interessiert sind.

verwandte Informationen