The task is to programmatically obtain the name used to invoke the program. (For example determine whether the user ran "python hello.py", or "python hellocaller.py", a program importing the code from "hello.py".)

Sometimes a multiline shebang is necessary in order to provide the script name to a language's internal ARGV.

See also Command-line arguments

Examples from GitHub.

 
 
/* ARM assembly Raspberry PI  */
/*  program namepgm.s   */
/* Constantes    */
.equ STDOUT, 1
.equ WRITE,  4
.equ EXIT,   1
/* Initialized data */
.data
szMessage: .asciz "Program : "       @ 
szRetourLigne: .asciz "\n"
 
 
.text
.global main 
main:	
    push {fp,lr}    /* save des  2 registres */
    add fp,sp,#8    /* fp <- adresse début */
    ldr r0, iAdrszMessage         @ adresse of message
    bl affichageMess            @ call function
    ldr r0,[fp,#4]                 @ recup name of program in command line
    bl affichageMess            @ call function
    ldr r0, iAdrszRetourLigne         @ adresse of message
    bl affichageMess            @ call function
 
 /* fin standard du programme */
    mov r0, #0                  @ return code
    pop {fp,lr}                 @restaur des  2 registres 
    mov r7, #EXIT              @ request to exit program
    swi 0                       @ perform the system call
iAdrszMessage: .int szMessage
iAdrszRetourLigne: .int szRetourLigne	
/******************************************************************/
/*     affichage des messages   avec calcul longueur              */ 
/******************************************************************/
/* r0 contient l adresse du message */
affichageMess:
	push {fp,lr}    /* save des  2 registres */ 
	push {r0,r1,r2,r7}    /* save des autres registres */
	mov r2,#0   /* compteur longueur */
1:	      /*calcul de la longueur */
        ldrb r1,[r0,r2]  /* recup octet position debut + indice */
	cmp r1,#0       /* si 0 c est fini */
	beq 1f
	add r2,r2,#1   /* sinon on ajoute 1 */
	b 1b
1:	/* donc ici r2 contient la longueur du message */
	mov r1,r0        /* adresse du message en r1 */
	mov r0,#STDOUT      /* code pour écrire sur la sortie standard Linux */
        mov r7, #WRITE                  /* code de l appel systeme "write" */
        swi #0                      /* appel systeme */
	pop {r0,r1,r2,r7}     /* restaur des autres registres */
	pop {fp,lr}    /* restaur des  2 registres */ 
        bx lr	        /* retour procedure */	
 
 