bash - programas - scripts linux ejercicios resueltos
Obtenga el nombre del script de la persona que llama en bash script (8)
Basado en @JLanswer, con explicaciones más detalladas (el único comando que funciona para mí ( linux )):
cat /proc/$PPID/comm
Te da el nombre del comando del pid padre
Si prefieres el comando con todas las opciones, entonces:
cat /proc/$PPID/cmdline
explicaciones
-
$PPIDestá definido por el shell, es el pid de los procesos principales - en
/proc/, tiene algunos/proc/con el pid de cada proceso ( linux ). Luego, sicat /proc/$PPID/comm,cat /proc/$PPID/commel nombre del comando del PID
Cheque hombre proc
Supongamos que tengo 3 scripts de shell:
script_1.sh
#!/bin/bash
./script_3.sh
script_2.sh
#!/bin/bash
./script_3.sh
el problema es que en script_3.sh quiero saber el nombre del script de la persona que llama.
para que pueda responder de manera diferente a cada persona que llamo
por favor, no asumas que estoy preguntando por $0 porque $0 se script_3 cada vez que no importa quién sea la persona que llama
Aquí hay un ejemplo de entrada con salida esperada
./script_1.shdebería hacerse eco descript_1./script_2.shdebería hacerse eco descript_2./script_3.shdebe hacerse eco deuser_name or root or anything to distinguish between the 3 cases?
¿Es eso posible? Y si es posible, ¿cómo se puede hacer?
esto se agregará a un script rm modificado ... así que cuando lo llamo rm hace algo y cuando git o cualquier otra herramienta CLI usa rm no se ve afectado por la modificación
Basado en la respuesta de @ user3100381, aquí hay un comando mucho más simple para obtener lo mismo que creo que debería ser bastante portátil:
PARENT_COMMAND=$(ps -o comm= $PPID)
Reemplace comm= con args= para obtener la línea de comando completa (comando + argumentos). El = solo se utiliza para suprimir los encabezados.
Consulte: http://pubs.opengroup.org/onlinepubs/009604499/utilities/ps.html
En caso de que esté realizando la source en lugar de llamar / ejecutar el script, no hay un nuevo proceso bifurcado y, por lo tanto, las soluciones con ps no funcionarán de manera confiable.
Use el caller incorporado de bash en ese caso.
Source
La variable $ PPID contiene el ID del proceso principal. Así que puedes analizar la salida de ps para obtener el comando.
#!/bin/bash
PARENT_COMMAND=$(ps $PPID | tail -n 1 | awk "{print /$5}")
Podría pasar una variable a script_3.sh para determinar cómo responder ...
script_1.sh
#!/bin/bash
./script_3.sh script1
script_2.sh
#!/bin/bash
./script_3.sh script2
script_3.sh
#!/bin/bash
if [ $1 == ''script1'' ] ; then
echo "we were called from script1!"
elsif [ $1 == ''script2'' ] ; then
echo "we were called from script2!"
fi
Si tienes /proc :
sed ''s//x0/ /g'' "/proc/$PPID/cmdline"
Simplemente puede usar el siguiente comando para evitar llamar a cut / awk / sed:
ps --no-headers -o command $PPID
Si solo desea que el padre y ninguno de los procesos posteriores, puede utilizar:
ps --no-headers -o command $PPID | cut -d'' '' -f1
Un par de archivos útiles guardados en / proc / $ PPID aquí
-
/proc/*some_process_id*/exeUn enlace simbólico al último comando ejecutado en * some_process_id * -
/proc/*some_process_id*/cmdlineUn archivo que contiene el último comando ejecutado bajo * some_process_id * y argumentos separados por nulos bytes
Así que una ligera simplificación.
$(cat /proc/$PPID/comm)