scripts script resueltos programas paso pasar parametros manejo hacer espaƱol ejercicios ejemplos como cadenas bash shell

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, si cat /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 de script_1

  • ./script_2.sh debería hacerse eco de script_2

  • ./script_3.sh debe hacerse eco de user_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)