Ich habe ein Skript launch.sh
, das sich selbst als ein anderer Benutzer ausführt, um Dateien mit dem richtigen Eigentümer zu erstellen. Ich möchte -x an diesen Aufruf übergeben, wenn er ursprünglich an das Skript übergeben wurde
if [ `whoami` == "deployuser" ]; then
... bunch of commands that need files to be created as deployuser
else
echo "Respawning myself as the deployment user... #Inception"
echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->"
sudo -u deployuser -H bash $0 "$@" # How to pass -x here if it was passed to the script initially?
fi
Ich habe die Bash-Debugging-Seite gelesen, aber es scheint keine eindeutige Option zu geben, die angibt, ob das ursprüngliche Skript mit gestartet wurde -x
.
[[ $- == *x* ]]
für den Mustervergleich verwenden.case $- in *x*) ... ;; *) ... ;; esac
. Es ist nützlich, diese Verwendungcase
für Skripte zu kennen , die portabel sein sollen, und jetzt, da ich davon weiß, fällt es mir leichter, mich nur daran zu erinnern, als sich daran zu erinnern, "wenn bash-spezifisch, dann[[
sonstcase
".$-
AusgängehB
. Was machen die-h
und-B
Flags / Argumente? Sehen Sie dann nicht in der Bash-Manpage .set -o
wird ausgegeben,xtrace on
wenn-x
andernfalls verwendet wirdxtrace off
.quelle
Obwohl die Antwort von @Patrick die "richtige" ist, können Sie auch einfach einen Parameter oder eine exportierte Variable an Ihr untergeordnetes Skript übergeben, die ihm sagt, was zu tun ist - wie das Aktivieren der Ablaufverfolgung.
Dies hat den Nachteil, dass Sie es (glaube ich) erneut in jede Skriptebene exportieren müssen, die Sie eingeben möchten.
Es hat den Vorteil, dass nur die Skripte, von denen Sie die Ausgabe / das geänderte Verhalten benötigen, selektiv verfolgt (oder anderweitig beeinflusst) werden können, um die externe Ausgabe usw. zu reduzieren. Beispielsweise kann die Ablaufverfolgung für das aufrufende Skript und deaktiviert sein werde immer noch im aufgerufenen Skript eingeschaltet. Es ist nicht alles oder nichts.
Nicht Teil Ihrer Frage, aber verwandt:
Ich definiere manchmal eine Variable wie
oder
und benutze es (in mehreren Aussagen) wie
oder, nur für die zweite Variante,
Dann kommentiere ich einfach die zweite Definition aus, wenn die Befehle ausgeführt werden sollen. Sie können diese Technik stattdessen auch mit einem Parameter oder einer exportierten Variablen verwenden.
Bei beiden müssen Sie auf zusammengesetzte Anweisungen achten, da die Methode garantiert nur für die erste Anweisung in der zusammengesetzten Liste funktioniert.
quelle
Sie können die PID des Prozesses abrufen und dann die Prozesstabelle mit ps untersuchen, um festzustellen, welche Argumente sie haben.
quelle
-x
im Skript festgelegt wurde, wird es nicht in derps
Ausgabe angezeigt . Und diese Lösung ist sowieso ineffizient.set -o
Lösung, die ich vorgeschlagen habe. Es sollte auch für Optionen funktionieren, denen kein Flag zugeordnet ist, wie z-x
.