J'ai un script launch.sh
qui s'exécute en tant qu'autre utilisateur afin de créer des fichiers avec le bon propriétaire. Je veux passer -x à cette invocation si elle a été initialement transmise au script
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
J'ai lu la page de débogage bash mais il ne semble pas y avoir d'option claire qui indique si le script d'origine a été lancé avec -x
.
[[ $- == *x* ]]
pour la correspondance de motifs.case $- in *x*) ... ;; *) ... ;; esac
. Il est utile de connaître cette utilisation decase
scripts destinés à être portables, et maintenant que je le sais, je trouve plus facile de m'en souvenir que de se rappeler "si spécifique à bash, alors[[
, sinoncase
".$-
sortieshB
. Que signifient les-h
et-B
drapeaux / arguments font? Ne voyez pas alors dans la page de manuel de bash .set -o
afficheraxtrace on
si-x
est utilisé, sinonxtrace off
.la source
Bien que la réponse de @Patrick soit la "bonne", vous pouvez également passer un paramètre ou une variable exportée dans votre script enfant qui lui indique quoi faire - comme activer le traçage.
Cela a l'inconvénient que (je crois) vous devez le réexporter vers chaque niveau de script que vous êtes sur le point d'entrer.
Il a l'avantage de pouvoir tracer de manière sélective (ou autrement affecter) uniquement le (s) script (s) dont vous avez besoin du comportement de sortie / modifié - pour réduire la sortie étrangère, etc. Par exemple, le traçage peut être désactivé pour le script appelant et toujours activé dans le script appelé. Ce n'est pas une proposition tout ou rien.
Ne fait pas partie de votre question, mais est liée:
Je définis parfois une variable comme
ou
et l'utiliser (dans plusieurs déclarations) comme
ou, juste pour la deuxième variation,
Ensuite, je commente simplement la deuxième définition lorsque je veux exécuter la ou les commandes. Vous pouvez également utiliser cette technique avec un paramètre ou une variable exportée à la place.
Avec l'un ou l'autre, vous devez faire attention aux instructions composées car la méthode ne fonctionne que sur la première instruction de la liste composée.
la source
Vous pouvez saisir le PID du processus, puis examiner la table de processus avec ps pour voir quels étaient ses arguments.
la source
-x
été défini dans le script, il ne sera pas affiché enps
sortie. Et cette solution est de toute façon inefficace.set -o
solution que j'ai proposée. Cela devrait également fonctionner pour les options qui n'ont pas de drapeau associé comme-x
.