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
-
$PPID
está 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/comm
el 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.sh
debería hacerse eco descript_1
./script_2.sh
debería hacerse eco descript_2
./script_3.sh
debe 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*/exe
Un enlace simbólico al último comando ejecutado en * some_process_id * -
/proc/*some_process_id*/cmdline
Un 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)