Obtenir le nom de l'appelant le script dans le script bash
Imaginons que j'ai 3 scripts shell:
script_1.sh
#!/bin/bash
./script_3.sh
script_2.sh
#!/bin/bash
./script_3.sh
le problème est que dans script_3.sh
je veux savoir le nom de l'appelant script.
afin que je puisse réagir différemment à chaque appelant je soutiens
s'il vous plaît ne présumez pas que je parle de $0
cause $0
se fera l'écho de script_3
à chaque fois, peu importe qui est l'appelant
voici un exemple d'entrée avec la sortie attendue de
-
./script_1.sh
devrait résonnerscript_1
-
./script_2.sh
devrait résonnerscript_2
-
./script_3.sh
devrait résonneruser_name or root or anything to distinguish between the 3 cases
?
Est-ce possible? et si possible, comment peut-il être fait?
cela va être ajouté à un rm
script modifié... donc quand j'ai appeler rm
il faire quelque chose et quand git
ou de tout autre CLI utilisation de l'outil rm
il n'est pas affecté par la modification
- Méfiez-vous de modifier le
rm
de commande (en donnant de l'aide de la couverture des scripts appelésrm
ou des alias, ou les fonctions). Vous aurez appris à compter sur la fonctionnalité, et puis un jour vous vous retrouvez à l'aide de la cruerm
commande sans les protections, et que vous allez faire de sérieux dégâts parce que vous avez été bercer d'un faux sentiment de sécurité.
Vous devez vous connecter pour publier un commentaire.
Basé sur @user3100381 réponse, voici un moyen beaucoup plus simple de commande pour obtenir la même chose qui, je crois, devrait être assez portable:
Remplacer
comm=
avecargs=
pour obtenir le plein de ligne de commande (commande + arguments). Le=
seul est utilisé pour supprimer les en-têtes.Voir: http://pubs.opengroup.org/onlinepubs/009604499/utilities/ps.html
ps
ne prend pas en charge la-o
option.L' $PPID variable contient le parent de l'ID de processus. Donc, vous pourriez analyser la sortie de ps pour obtenir la commande.
ps
, de sorte que la queue et Awk (qui pourrait facilement être refait juste Awk, btw) peuvent être évités./bin/bash
awk "{print \$6}"
$6
faire./script_3
imprime'\n'
chaîne vide et./script_2
retour'\n./script_3'
ps $PPID | tail -n 1 | awk "{print \$6}"
devrait sortie et je peut le comprendreps $PPID
, puisps $PPID | tail -n 1
, puis ajouter le awk. Vous pouvez également ajouter le drapeau F pourps
pour obtenir arguments de la commande, si le sed du fichier ps lit se sent toujours un peu plus simple.Dans le cas où vous êtes
source
ing au lieu de l'appel/l'exécution du script, il n'y a pas de nouveaux processus de fourche et donc les solutions avecps
ne fonctionne pas de manière fiable.Utiliser bash intégré
caller
dans ce cas.Source
Quelques fichiers utiles choses conservés dans /proc/$PPID ici
/proc/*some_process_id*/exe
Un lien symbolique vers la dernière commande exécutée en vertu de l' *some_process_id*/proc/*some_process_id*/cmdline
Un fichier contenant la dernière commande exécutée en vertu de l' *some_process_id* et null-octets séparés argumentsDonc une légère simplification.
sed: /proc/97727/cmdline: No such file or directory
cd
de /proc/97727? Et si vous n'avez pas cela, vous avez toutes les pid des répertoires dans /proc?ps -Af -p $PPID | awk {'print $8'}
. Je suis sûr qu'il y est un emplacement de stockage comme bien (vous pourriez être en mesure de tracer dehors du ps), mais difficile à comprendre sans l'accès au système et n'a pas beaucoup d'importance.ps -f -p $PPID | tail -n 1 | awk {'print $8'}
Si vous avez
/proc
:$(< /proc/$PPID/comm)
Basé sur @J. L. de répondre, avec plus de profondeur des explications (c'est la seule commande qui fonctionne pour moi (linux)) :
vous donne le nom de la commande de la mère pid
Si vous préférez la commande avec toutes les options, puis :
explications :
$PPID
est défini par le shell, c'est le pid de la mère processus/proc/
, vous avez quelques dirs avec le pid de chaque processus (linux). Alors, si vouscat /proc/$PPID/comm
, vous l'écho le nom de la commande de PIDVérifier l'homme proc
Vous pouvez simplement utiliser la commande ci-dessous pour éviter d'appeler un couper/awk/sed:
Si vous voulez seulement le parent et aucun de la suite de la procédure, vous pouvez utiliser:
Vous pourriez passer une variable à script_3.sh pour déterminer comment répondre...
script_1.sh
script_2.sh
script_3.sh
rm
et je veux qu'il soit appelé si j'ai appelérm
pas sigit
utilisérm
de supprimer certaines informations.