Program name: Difference between revisions

Add Ecstasy example
(Added Mozart/Oz)
(Add Ecstasy example)
 
(137 intermediate revisions by 70 users not shown)
Line 7:
 
Examples from [https://github.com/mcandre/scriptname GitHub].
 
=={{header|11l}}==
<syntaxhighlight lang="11l">:start:
print(‘Program: ’:argv[0])</syntaxhighlight>
=={{header|68000 Assembly}}==
{{works with|NEOGEO}}
The name of the game is stored on the cartridge at memory address $000200. It is exactly 16 characters and is padded with spaces (ASCII 32). Since there is no null terminator after this string, use its size to terminate a printing loop.
 
<syntaxhighlight lang="68000devpac">LEA $000200,A3
JSR PrintString ;(my print routine is 255-terminated and there just so happens to be an FF after the name of the game.)</syntaxhighlight>
 
;Output
[[https://ibb.co/4jNm7TW Ninja Adventure]]
 
=={{header|AArch64 Assembly}}==
 
{{works with|aarch64-linux-gnu-as/qemu-aarch64}}
 
Without built-in CRT, <code>argc</code> and <code>argv</code> are stored in the stack. The format looks like:
 
<syntaxhighlight lang="text">sp+0 = argc
sp+8 = argv[0]
sp+16 = argv[1] ...</syntaxhighlight>
 
Each item of <code>argv</code> is a pointer to a null-terminated 8-bit string.
 
<syntaxhighlight lang="arm_assembly">.equ STDOUT, 1
.equ SVC_WRITE, 64
.equ SVC_EXIT, 93
 
.text
.global _start
 
_start:
stp x29, x30, [sp, -16]!
mov x29, sp
ldr x0, [sp, 24] // argv[0]
bl _strlen // strlen(argv[0])
mov x2, x0
mov x0, #STDOUT
ldr x1, [sp, 24]
bl _write // write(stdout, argv[0], strlen(argv[0]))
ldp x29, x30, [sp], 16
mov x0, #0
b _exit // exit(0);
 
// ssize_t _strlen(const char *str)
_strlen:
mov x1, x0
mov x0, #-1
1: add x0, x0, #1
ldrb w2, [x1, x0]
cbnz x2, 1b
ret
 
.text
//////////////// system call wrappers
// ssize_t _write(int fd, void *buf, size_t count)
_write:
stp x29, x30, [sp, -16]!
mov x8, #SVC_WRITE
mov x29, sp
svc #0
ldp x29, x30, [sp], 16
ret
 
// void _exit(int retval)
_exit:
mov x8, #SVC_EXIT
svc #0</syntaxhighlight>
 
=={{header|Ada}}==
Being a compiled language, Ada has difficulties accessing source code filenames. But it is easy to access the executable's filename, using the function Command_Name defined in Ada.Command_Line:
<langsyntaxhighlight Adalang="ada">with Ada.Command_Line, Ada.Text_IO;
 
procedure Command_Name is
begin
Ada.Text_IO.Put_Line(Ada.Command_Line.Command_Name);
end Command_Name;</langsyntaxhighlight>
 
=={{header|Aime}}==
The program command line arguments are accessible via the argc()/argv() functions. The program name is the first in the list of arguments.
<syntaxhighlight lang="aime">o_text(argv(0));
o_byte('\n');</syntaxhighlight>
 
=={{header|ALGOL 68}}==
<syntaxhighlight lang="text">
BEGIN
print ((program idf, newline))
END
</syntaxhighlight>
{{out}}
<pre>
$ a68g Program_name.a68
Program_name.a68
$
</pre>
 
=={{header|Amazing Hopper}}==
El primer parámetro en Hopper y sus sabores, siempre será el nombre del programa.
<syntaxhighlight lang="amazing hopper">
#include <hbasic.h>
Begin
GetParam(name File)
Print("My Program name: ", name File,Newl)
End
</syntaxhighlight>
{{out}}
<pre>
$ hopper myname.bas
My Program name: myname.bas
$
</pre>
 
=={{header|Applesoft BASIC}}==
<syntaxhighlight lang="applesoftbasic">
10 GOSUB 40"GET PROGRAM NAME
20 PRINT N$
30 END
 
40 REMGET PROGRAM NAME
50 GOSUB 100"GET INPUT BUFFER
60 GOSUB 200"REMOVE RUN PREFIX
70 GOSUB 300"REMOVE , SUFFIXES
80 GOSUB 400"TRIM SPACES
90 RETURN
 
100 REMGET INPUT BUFFER
110 N$ = ""
120 FOR I = 512 TO 767
130 B = PEEK (I) - 128
140 IF B < 32 THEN RETURN
150 N$ = N$ + CHR$ (B)
160 NEXT I
170 RETURN
 
200 REMREMOVE RUN PREFIX
210 P = 1
220 FOR I = 1 TO 3
230 FOR J = P TO LEN(N$)
240 C$ = MID$ (N$,J,1)
250 P = P + 1
260 IF C$ = " " THEN NEXT J
270 IF C$ = MID$("RUN",I,1) THEN NEXT I:N$ = MID$(N$,P,LEN(N$)-P+1):RETURN
280 PRINT "YOU NEED TO RUN THIS PROGRAM USING THE RUN COMMAND FROM DOS."
290 END
 
300 REMREMOVE , SUFFIXES
310 L = LEN (N$)
320 FOR I = 1 TO L
330 C$ = MID$ (N$,I,1)
340 IF C$ = "," THEN N$ = LEFT$(N$,I - 1): RETURN
350 NEXT I
360 RETURN
 
400 REMTRIM SPACES
410 GOSUB 600
 
500 REMLEFT TRIM SPACES
510 L = LEN(N$) - 1
520 FOR I = L TO 0 STEP -1
530 IF I < 0 THEN RETURN
540 IF LEFT$ (N$,1) <> " " THEN RETURN
550 IF I THEN N$ = RIGHT$ (N$, I)
560 NEXT I
570 N$ = "
580 RETURN
 
600 REMRIGHT TRIM SPACES
610 L = LEN(N$) - 1
620 FOR I = L TO 0 STEP -1
630 IF I < 0 THEN RETURN
640 IF RIGHT$ (N$,1) <> " " THEN RETURN
650 IF I THEN N$ = LEFT$ (N$, I)
660 NEXT I
670 N$ = "
680 RETURN
</syntaxhighlight>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
 
/* 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 */
</syntaxhighlight>
 
=={{header|AutoHotkey}}==
<syntaxhighlight lang="autohotkey">
<lang AutoHotkey>
MsgBox, % A_ScriptName
</syntaxhighlight>
</lang>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
# syntax: TAWK -f PROGRAM_NAME.AWK
#
# GAWK can provide the invoking program name from ARGV[0] but is unable to
# provide the AWK script name that follows -f. Thompson Automation's TAWK
# version 5.0c, last released in 1998 and no longer commercially available, can
# provide the AWK script name that follows -f from the PROGFN built-in
# variable. It should also provide the invoking program name, E.G. TAWK, from
# ARGV[0] but due to a bug it holds the fully qualified -f name instead.
#
# This example is posted here with hopes the TAWK built-in variables PROGFN
# (PROGram File Name) and PROGLN (PROGram Line Number) be added to GAWK by its
# developers.
#
BEGIN {
printf("%s -f %s\n",ARGV[0],PROGFN)
printf("line number %d\n",PROGLN)
exit(0)
}
</syntaxhighlight>
{{out}}
<pre>
TAWK -f PROGRAM_NAME.AWK
C:\program_name.awk -f program_name.awk
line number 16
 
GAWK -f PROGRAM_NAME.AWK
gawk -f
line number 0
</pre>
 
=={{header|BASIC}}==
Line 26 ⟶ 287:
Many BASICs -- notably older DOS BASICs, and especially DOS MS BASICs -- do not provide any way to retrieve the program's name.
 
==={{header|FreeBASIC}}===
 
Unlike most MS BASICs, [[FreeBASIC]] provides a parsed version of <code>[http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgCommand COMMAND$]</code> (called as <code>COMMAND$(n)</code>). <code>COMMAND$(0)</code> is the program's name:
<langsyntaxhighlight lang="qbasic">appname = COMMAND$(0)</langsyntaxhighlight>
 
Additionally, FreeBASIC also provides an analog of [[#C|C's]] <code>argc/argv[]</code>, called <code>[http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgDdfbargc __FB_ARGC__]</code> and <code>[http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgDdfbargv __FB_ARGV__]</code>. __FB_ARGV__ can be used to get the program's name like this:
<langsyntaxhighlight lang="qbasic">appname = *__FB_ARGV__(0)</langsyntaxhighlight>
 
See also: [[#PowerBASIC|PowerBASIC]], [[#PureBasic|PureBasic]], [[#Visual Basic|Visual Basic]].
 
==={{header|BBC BASIC}}===
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> SYS "GetCommandLine" TO cl%
PRINT $$cl%</langsyntaxhighlight>
 
==={{header|IS-BASIC}}===
<syntaxhighlight lang="is-basic">100 PROGRAM "Name1.bas"(A,B,C,S$)
110 CHAIN "Name2.BAS"(A,B,C,S$)
 
edit 1
100 PROGRAM "Name2.bas"(A,B,C,S$)
110 PRINT A,B,C,S$
 
edit 0
start(1,2,3,"Hello")</syntaxhighlight>
 
==={{header|BaCon}}===
To get the name with which the program was invoked:
<syntaxhighlight lang="bacon">PRINT TOKEN$(ARGUMENT$, 1)</syntaxhighlight>
To get the full path:
<syntaxhighlight lang="bacon">PRINT ME$</syntaxhighlight>
==={{header|uBasic/4tH}}===
'''CMD(1)''' returns a string with the filename - '''SHOW()''' prints this string.
<syntaxhighlight lang="text">Print Show(Cmd(1))</syntaxhighlight>
 
=={{header|Blue}}==
 
Linux/x86-64. Will print the name of the executable from "argv[0]" as provided.
 
<syntaxhighlight lang="blue">global _start
 
: syscall ( num:eax -- result:eax ) syscall ;
 
: exit ( status:edi -- noret ) 60 syscall ;
: bye ( -- noret ) 0 exit ;
 
: write ( buf:esi len:edx fd:edi -- ) 1 syscall drop ;
 
1 const stdout
 
: print ( buf len -- ) stdout write ;
 
: newline ( -- ) s" \n" print ;
: println ( buf len -- ) print newline ;
 
: find0 ( start:rsi -- end:rsi ) lodsb 0 cmp latest xne ;
: cstrlen ( str:rdi -- len:rsi ) dup find0 swap sub dec ;
: cstr>str ( cstr:rdx -- str:rsi len:rdx ) dup cstrlen xchg ;
 
: print-arg ( arg -- ) cstr>str println ;
 
: arg0 ( rsp -- rsp ) 8 add @ ; inline
 
: _start ( rsp -- noret ) arg0 print-arg bye ;</syntaxhighlight>
 
=={{header|BQN}}==
<syntaxhighlight lang="bqn">•name</syntaxhighlight>
 
=={{header|C}}==
Line 46 ⟶ 360:
* <code>argv[0]</code> might be the name of an executable in the PATH, or it might be an absolute or relative path to the executable. At least with [[Unix]], the parent process can set <code>argv[0]</code> to any string, so <code>argv[0]</code> might not be the real name. It is best to pretend that <code>argv[0]</code> has the correct value, but mind that <code>argv[0]</code> might not be an actual file.
 
<langsyntaxhighlight lang="c">#include <stdio.h>
 
int main(int argc, char **argv) {
Line 52 ⟶ 366:
 
return 0;
}</langsyntaxhighlight>
 
To get the source information about some part of code, use compiler defined macros. Most compilers support them or some variation of.
<langsyntaxhighlight lang="c">#include <stdio.h>
int main()
Line 62 ⟶ 376:
__FILE__, __FUNCTION__, __LINE__);
return 0;
}</langsyntaxhighlight>
 
=== BSD ===
Line 75 ⟶ 389:
{{works with|OpenBSD|5.0}} '''To compile myname.c:''' <code>make myname LDLIBS=-lkvm</code>
 
<langsyntaxhighlight lang="c">/* myname.c */
 
#include <sys/param.h>
Line 111 ⟶ 425:
kvm_close(kd);
return 0;
}</langsyntaxhighlight>
 
The program can have three different names!
Line 124 ⟶ 438:
 
{{libheader|Win32}}
<langsyntaxhighlight lang="c">#include <windows.h>
#include <stdlib.h>
#include <wchar.h>
Line 180 ⟶ 494:
free(path);
return 0;
}</langsyntaxhighlight>
 
<pre>Path to executable: C:\Users\kernigh\Documents\field\scratch.exe</pre>
 
=={{header|C++}}==
C++ has difficulty accessing source code filenames, because C code must be compiled into an executable. However, C++ can access the executable's filename.
 
<lang cpp>#include <iostream>
 
using namespace std;
 
int main(int argc, char **argv) {
char *program = argv[0];
cout << "Program: " << program << endl;
 
return 0;
}</lang>
=={{header|C sharp|C#}}==
This effectively outputs the executable name, file path, and any arguments for the current program.
<langsyntaxhighlight lang="csharp">using System;
namespace ProgramName
{
Line 209 ⟶ 510:
}
}
}</langsyntaxhighlight>
In a C# application with a reference to System.Windows.Forms, the following can be used to retrieve the executable name and arguments without the full path.
<langsyntaxhighlight lang="csharp">using System;
namespace ProgramName
{
Line 229 ⟶ 530:
}
}
}</langsyntaxhighlight>
 
=={{header|ClojureC++}}==
C++ can access the executable's filename through the arguments to main().
If the shebang is used to run the script directly, this prints the script name. Otherwise, it prints nil.
 
<syntaxhighlight lang="cpp">#include <iostream>
<lang clojure>":";exec clj -m `basename $0 .clj` $0 ${1+"$@"}
 
using namespace std;
 
int main(int argc, char **argv) {
char *program = argv[0];
cout << "Program: " << program << endl;
}</syntaxhighlight>
 
=={{header|Clojure}}==
<syntaxhighlight lang="clojure">":";exec lein exec $0 ${1+"$@"}
":";exit
 
(ns scriptname
(:gen-class))
 
(defn -main [& args]
(deflet [program (nthfirst *command-line-args 0)*)]
(println "Program:" program))</lang>)
 
(when (.contains (first *command-line-args*) *source-path*)
(apply -main (rest *command-line-args*)))</syntaxhighlight>
 
=={{header|COBOL}}==
{{works with|GnuCOBOL}}
COBOL has an internal PROGRAM-ID name, and then the external invocation name.
 
<syntaxhighlight lang="cobol"> identification division.
program-id. sample.
 
data division.
working-storage section.
01 progname pic x(16).
 
procedure division.
sample-main.
 
display 0 upon argument-number
accept progname from argument-value
display "argument-value zero :" progname ":"
 
display "function module-id :" function module-id ":"
 
goback.
end program sample.</syntaxhighlight>
 
{{out}}
<pre>prompt$ cobc -xj progname.cob
argument-value zero :./progname :
function module-id :sample:</pre>
 
=={{header|CoffeeScript}}==
scriptname.coffee:
<syntaxhighlight lang="coffeescript">#!/usr/bin/env coffee
 
main = () ->
program = __filename
console.log "Program: " + program
 
if not module.parent then main()</syntaxhighlight>
 
=={{header|Common Lisp}}==
Shebangs require a special tweak to ~/.clisprc.lisp.
 
<langsyntaxhighlight lang="lisp">;;; Play nice with shebangs
(set-dispatch-macro-character #\# #\!
(lambda (stream character n)
(declare (ignore character n))
(read-line stream nil nil t)
nil))</langsyntaxhighlight>
 
<langsyntaxhighlight lang="lisp">#!/bin/sh
#|
exec clisp -q -q $0 $0 ${1+"$@"}
Line 283 ⟶ 635:
args
:test #'(lambda (x y) (search x y :test #'equalp)))
(main args)))</langsyntaxhighlight>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">#!/usr/bin/env rdmd
 
import std.stdio;
Line 292 ⟶ 644:
void main(in string[] args) {
writeln("Program: ", args[0]);
}</langsyntaxhighlight>
{{out}}
<pre>C:\rosetta>program_name.exe
Program: program_name.exe</pre>
 
<langsyntaxhighlight lang="sh">$ dmd scriptname.d
$ ./scriptname
Program: ./scriptname</langsyntaxhighlight>
 
If the system is configured, the D programming language offers an 'interpreted-looking' mode, which exhibits slightly different behavior than the normal compilation:
<langsyntaxhighlight lang="sh">$ ./scriptname.d
Program: /tmp/.rdmd/Users/andrew/Desktop/src/scriptname/scriptname.d.D3B32385A31B968A3CF8CAF1E1426E5F</langsyntaxhighlight>
 
 
Alternative method using built-in function [http://dlang.org/changelog.html#current_path thisExePath()]
{{works with|D|2.064+}}
<syntaxhighlight lang="d">// thisExePath function was introduced in D 2.064 (November 5, 2013)
 
import std.file;
import std.stdio;
 
void main(string[] args)
{
writeln("Program: ", thisExePath());
}</syntaxhighlight>
{{out}} <pre>Z:\rosettacode>program_name.exe
Program: Z:\rosettacode\program_name.exe</pre>
 
=={{header|Dart}}==
<langsyntaxhighlight lang="dart">#!/usr/bin/env dart
 
main() {
var program = new Options().script;
print("Program: ${program}");
}</langsyntaxhighlight>
 
=={{header|Delphi}}==
<langsyntaxhighlight Delphilang="delphi">program ProgramName;
 
{$APPTYPE CONSOLE}
Line 321 ⟶ 688:
Writeln('Program name: ' + ParamStr(0));
Writeln('Command line: ' + CmdLine);
end.</langsyntaxhighlight>
 
=={{header|Déjà Vu}}==
 
<syntaxhighlight lang="dejavu">!print( "Name of this file: " get-from !args 0 )</syntaxhighlight>
 
=={{header|EchoLisp}}==
<syntaxhighlight lang="lisp">
(js-eval "window.location.href")
→ "http://www.echolalie.org/echolisp/"
</syntaxhighlight>
 
=={{header|Ecstasy}}==
<syntaxhighlight lang="ecstasy">
module WhatIsMyName {
@Inject Console console;
 
void run() {
console.print($"program name: {this:module}");
}
}
</syntaxhighlight>
 
{{out}}
<pre>
program name: WhatIsMyName
</pre>
 
=={{header|Elena}}==
ELENA 4.x :
<syntaxhighlight lang="elena">import extensions;
public program()
{
console.printLine(program_arguments.asEnumerable()); // the whole command line
console.printLine(program_arguments[0]); // the program name
}</syntaxhighlight>
 
=={{header|Emacs Lisp}}==
<langsyntaxhighlight lang="lisp">:;exec emacs -batch -l $0 -f main $*
 
;;; Shebang from John Swaby
Line 330 ⟶ 734:
 
(defun main ()
(let ((program (nth 2 command-line-args)))
(message "Program: %s" program)))</langsyntaxhighlight>
 
<code>load-file-name</code> is the ".el" or ".elc" currently being loaded. Within a batch <code>-l</code> it will be the script name, but within sub-loads like <code>require</code> etc it is that sub-load.
 
=={{header|EMal}}==
<syntaxhighlight lang="emal">
writeLine("path: " + Runtime.path)
writeLine("name: " + Runtime.name)
writeLine("args: " + Runtime.args)
</syntaxhighlight>
{{out}}
<pre>
emal.exe Org\RosettaCode\ProgramName.emal sample arguments
path: C:\tmp\Org\RosettaCode\ProgramName.emal
name: ProgramName.emal
args: [sample,arguments]
</pre>
 
=={{header|Erlang}}==
If Erlang is used as a script language the function escript:script_name/0 will return the program name.
Erlang's macros hold information about the running module.
When compiled Erlang's macros hold information about the running module.
 
<syntaxhighlight lang="erlang">%% Compile
<lang erlang>-module(scriptname).
%%
%% erlc scriptname.erl
%%
%% Run
%%
%% erl -noshell -s scriptname
 
-module(scriptname).
main(_) ->
-export([start/0]).
Program = ?FILE,
 
io:format("Program: ~s~n", [Program]).</lang>
start() ->
Program = ?FILE,
io:format("Program: ~s~n", [Program]),
init:stop().</syntaxhighlight>
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">constant cmd = command_line()
puts(1,cmd[2])</langsyntaxhighlight>
 
=={{header|F Sharp|F#}}==
 
This code correctly prints the program name in three modes:
Line 354 ⟶ 785:
* Run as a dotslashed program in Unix (./scriptname.fsx)
 
<langsyntaxhighlight lang="fsharp">#light (*
exec fsharpi --exec $0 --quiet
*)
Line 373 ⟶ 804:
 
let main =
printfn "%s" scriptname</langsyntaxhighlight>
 
=={{header|Factor}}==
 
<langsyntaxhighlight lang="factor">#! /usr/bin/env factor
USING: namespaces io command-line ;
Line 384 ⟶ 815:
: main ( -- ) script get print ;
MAIN: main</langsyntaxhighlight>
 
=={{header|Forth}}==
{{works with|GNU Forth}}
<langsyntaxhighlight lang="forth">0 arg type cr \ gforth or gforth-fast, for example
1 arg type cr \ name of script</langsyntaxhighlight>
 
=={{header|Fortran}}==
Please find example runs in the comments at the beginning of the FORTRAN2003 source. Program name verification can deter system attackers. Therefore, the code is provided as a separate easily reused module.
<syntaxhighlight lang="fortran">
! program run with invalid name path/f
!
!-*- mode: compilation; default-directory: "/tmp/" -*-
!Compilation started at Sun Jun 2 00:18:31
!
!a=./f && make $a && OMP_NUM_THREADS=2 $a < unixdict.txt
!gfortran -std=f2008 -Wall -fopenmp -ffree-form -fall-intrinsics -fimplicit-none f.f08 -o f
!
!Compilation finished at Sun Jun 2 00:18:31
 
 
 
! program run with valid name path/rcname
!
!-*- mode: compilation; default-directory: "/tmp/" -*-
!Compilation started at Sun Jun 2 00:19:01
!
!gfortran -std=f2008 -Wall -fopenmp -ffree-form -fall-intrinsics -fimplicit-none f.f08 -o rcname && ./rcname
! ./rcname approved.
! program continues...
!
!Compilation finished at Sun Jun 2 00:19:02
 
 
module sundry
 
contains
 
subroutine verify_name(required)
! name verification reduces the ways an attacker can rename rm as cp.
character(len=*), intent(in) :: required
character(len=1024) :: name
integer :: length, status
! I believe get_command_argument is part of the 2003 FORTRAN standard intrinsics.
call get_command_argument(0, name, length, status)
if (0 /= status) stop
if ((len_trim(name)+1) .ne. (index(name, required, back=.true.) + len(required))) stop
write(6,*) trim(name)//' approved.'
end subroutine verify_name
 
end module sundry
 
program name
use sundry
call verify_name('rcname')
write(6,*)'program continues...'
end program name
</syntaxhighlight>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Print "The program was invoked like this => "; Command(0) + " " + Command(-1)
Print "Press any key to quit"
Sleep</syntaxhighlight>
 
 
=={{header|FutureBasic}}==
There are several ways to retrieve the program name. These functions return a string containing the name that can be used in various ways.
<syntaxhighlight lang="futurebasic">
print fn ProcessInfoProcessName
print fn RunningApplicationLocalizedName( fn RunningApplicationCurrentApplication )
</syntaxhighlight>
 
=={{header|Gambas}}==
'''[https://gambas-playground.proko.eu/?gist=fc8af45b13a9bb52b6955bab487fc7ac Click this link to run this code]'''
<syntaxhighlight lang="gambas">Public Sub Main()
Dim sTemp As String
 
Print "Command to start the program was ";;
 
For Each sTemp In Args.All
Print sTemp;;
Next
 
End</syntaxhighlight>
Output:
<pre>
Command to start the program was ./CLIOnly.gambas Hello World!
</pre>
 
=={{header|Genie}}==
<syntaxhighlight lang="genie">[indent=4]
init
print args[0]
print Path.get_basename(args[0])
print Environment.get_application_name()
print Environment.get_prgname()</syntaxhighlight>
 
{{out}}
<pre>prompt$ valac programname.gs
prompt$ ./programname
./programname
programname
(null)
(null)</pre>
 
=={{header|Go}}==
scriptname.go:
 
<langsyntaxhighlight lang="go">package main
 
import (
Line 403 ⟶ 934:
func main() {
fmt.Println("Program:", os.Args[0])
}</langsyntaxhighlight>
{{out|Command line session}}
<pre>
Line 419 ⟶ 950:
If you want the script filename, use:
 
<langsyntaxhighlight lang="groovy">#!/usr/bin/env groovy
 
def program = getClass().protectionDomain.codeSource.location.path
 
println "Program: " + program</langsyntaxhighlight>
 
But if you just want the class name, there are easier ways.
 
So, just typing in and running the following in the GroovyConsole environment:
<syntaxhighlight lang ="groovy">println this.class.getName()</langsyntaxhighlight>
yields the following on the first run:
<pre>ConsoleScript0</pre>
Line 442 ⟶ 973:
Haskell has an impure function for this.
 
<langsyntaxhighlight lang="haskell">import System (getProgName)
 
main :: IO ()
main = getProgName >>= putStrLn . ("Program: " ++)</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon">procedure main()
write(&progname) # obtain and write out the program name from the keyword &progname
end</langsyntaxhighlight>
 
=={{header|Io}}==
<langsyntaxhighlight lang="io">#!/usr/bin/env io
 
main := method(
Line 461 ⟶ 992:
)
 
if (System args size > 0 and System args at(0) containsSeq("scriptname"), main)</langsyntaxhighlight>
 
=={{header|J}}==
 
<langsyntaxhighlight lang="j">#!/usr/bin/env jconsole
 
program =: monad : 0
Line 477 ⟶ 1,008:
echo 'Program: ', program 0
 
exit ''</langsyntaxhighlight>
 
=={{header|Jakt}}==
The name of the program is stored in the first index of the array passed to main. This is the name of the compiled executable, so when using jakt -cr the value will be a path starting with build/.
 
<syntaxhighlight lang="jakt">
fn main(arguments: [String]) {
let program_name = arguments[0]
println("{}", program_name)
}
</syntaxhighlight>
 
=={{header|Java}}==
Line 486 ⟶ 1,027:
 
You can get the listing of the arguments to the <code>java</code> command through a system property. The first one is the name of the main class that was run. This depends on a system property named "sun.java.command", which might not exist on all Java virtual machines.
<langsyntaxhighlight lang="java">public class ScriptName {
public static void main(String[] args) {
String program = System.getProperty("sun.java.command").split(" ")[0];
System.out.println("Program: " + program);
}
}</langsyntaxhighlight>
 
An alternate solution is to create a dummy inner class, and then retrieve its enclosing class (which is the class the main method is in) through reflection (though this will not work if the code is placed in a method in another source file--it will give the name of the class it is in inside that source file):
<langsyntaxhighlight lang="java">public class ScriptName {
public static void main(String[] args) {
Class c = new Object(){}.getClass().getEnclosingClass();
System.out.println("Program: " + c.getName());
}
}</langsyntaxhighlight>
 
A solution using the security manager:
<langsyntaxhighlight lang="java">public class ScriptName {
public static void main(String[] args) {
Class c = System.getSecurityManager().getClassContext()[0];
System.out.println("Program: " + c.getName());
}
}</langsyntaxhighlight>
 
A solution using the stack trace (requires Java 1.5+):
<langsyntaxhighlight lang="java">public class ScriptName {
public static void main(String[] args) {
String program = Thread.currentThread().getStackTrace()[1].getClassName();
System.out.println("Program: " + program);
}
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
{{incorrect|JavaScript|Program name, not function name. Show sample output.}}
 
<small><i>Suggestion: document.location.href is probably closer to task requirements (and better than a script name), plus arguments.callee.name is long dead. --[[User:Petelomax|Pete Lomax]] ([[User talk:Petelomax|talk]]) 23:29, 24 March 2022 (UTC)</i></small><br>
There is no capability within the ECMA-262 standard (the standard for ECMAScript, the language underlying JavaScript) for a function to determine its name. Since objects in JavaScript are first class objects, variables and properties are only references to objects. The name of an object might be said to be the name used to reference it, however a single object may have many variables and properties that reference it, or none.
 
In some implementations, the following (non–standard) code will work:
 
<langsyntaxhighlight lang="javascript">function foo() {
return arguments.callee.name;
}</langsyntaxhighlight>
 
But it will fail in in others. JavaScript also has anonymous functions that don't have a name, e.g.:
<langsyntaxhighlight lang="javascript">(function(){alert(arguments.callee.name);}())</langsyntaxhighlight>
returns an empty string or <code>undefined</code> even where the first example works.
 
Line 534 ⟶ 1,076:
Node.js has a global variable for this.
 
<langsyntaxhighlight lang="javascript">#!/usr/bin/env node
/*jslint nodejs:true */
 
Line 542 ⟶ 1,084:
}
 
if (!module.parent) { main(); }</langsyntaxhighlight>
 
=={{header|Joy}}==
<syntaxhighlight lang="joy">#!/usr/bin/joy
 
argv first putchars.</syntaxhighlight>
 
=={{header|Jsish}}==
<syntaxhighlight lang="javascript">#!/usr/bin/env jsish
/* Program name, in Jsish */
puts('Executable:', Info.executable());
puts('Argv0 :', Info.argv0());</syntaxhighlight>
 
{{out}}
<pre>prompt$ jsish programName.jsi
Executable: /usr/local/bin/jsish
Argv0 : /home/btiffin/forge/jsi/jsi-test/rosetta/programName.jsi</pre>
 
=={{header|Julia}}==
Julia strips the program file name from <tt>ARGS</tt>, so this information is not available to the program from its command line arguments. Instead it is accessible via <tt>Base.source_path()</tt>.
<syntaxhighlight lang="julia">
prog = basename(Base.source_path())
println("This program file is \"", prog, "\".")
</syntaxhighlight>
 
{{out}}
<pre>
This program file is "program_name.jl".
</pre>
 
=={{header|Kotlin}}==
<syntaxhighlight lang="scala">// version 1.0.6
 
// 'progname.kt' packaged as 'progname.jar'
 
fun main(args: Array<String>) {
println(System.getProperty("sun.java.command")) // may not exist on all JVMs
println(System.getProperty("java.vm.name"))
}</syntaxhighlight>
 
{{out}}
<pre>
progname.jar
Java HotSpot(TM) 64-Bit Server VM
</pre>
 
=={{header|langur}}==
The script name is in the _script variable (separate from the arguments, in the _args variable).
<syntaxhighlight lang="langur">writeln "script: ", _script
writeln "script args: ", _args</syntaxhighlight>
 
{{out}}
<pre>script: ./testargs.langur
script args: []</pre>
 
=={{header|Lasso}}==
<syntaxhighlight lang="lasso">#!/usr/bin/lasso9
 
stdoutnl("Program: " + $argv->first)</syntaxhighlight>
Output:
<syntaxhighlight lang="shell">$ lasso9 script_name.lasso
Program: script_name.lasso</syntaxhighlight>
 
=={{header|Liberty BASIC}}==
<syntaxhighlight lang="lb">
nSize = _MAX_PATH + 2
lpFilename$ = space$(nSize); chr$(0)
 
calldll #kernel32, "GetModuleFileNameA", _
hModule as ulong, _
lpFilename$ as ptr, _
nSize as ulong, _
result as ulong
lpFilename$ = left$(lpFilename$,result)
 
print "Path to LB exe"
print lpFilename$
print "current program file (:last one on LRU list)"
print getLastLRU$(lbPath$)
end
 
Function getLastLRU$(lbPath$)
open lbPath$+"lbasic404.ini" for input as #1
while not(eof(#1))
line input #1, a$
if instr(a$, "recent files")<>0 then [readRecentFiles]
wend
getLastLRU$ = "* Failed: Recent files section not found *"
close #1
exit function
 
[readRecentFiles]
nRecent = val(word$(a$,1))
'print "nRecentFiles", nRecent
for i = 1 to nRecent
if eof(#1) then
getLastLRU$ = "* Failed: File ended while in recent files section *"
close #1
exit function
end if
line input #1, a$
'print i, a$
next
close #1
getLastLRU$ = a$
end function
 
</syntaxhighlight>
Output:
<syntaxhighlight lang="text">
Path to LB exe
C:\progs\Liberty BASIC v4.04\liberty.exe
current program file (:last one on LRU list)
C:\progs\Liberty BASIC v4.04\untitled.bas
</syntaxhighlight>
 
=={{header|Lingo}}==
<syntaxhighlight lang="lingo">put _player.applicationName
-- "lsw.exe"
put _movie.name
-- "lsw_win_d11.dir"</syntaxhighlight>
 
=={{header|LLVM}}==
Like C, LLVM can use argv to access the executable's filename.
 
<langsyntaxhighlight lang="sh">$ make
llvm-as scriptname.ll
llc -disable-cfi scriptname.bc
gcc -o scriptname scriptname.s
./scriptname
Program: ./scriptname</langsyntaxhighlight>
 
Makefile
 
 
<lang make>all: scriptname.ll
<syntaxhighlight lang="make">all: scriptname.ll
llvm-as scriptname.ll
llc scriptname.bc
Line 565 ⟶ 1,228:
-rm scriptname
-rm scriptname.s
-rm scriptname.bc</langsyntaxhighlight>
 
<langsyntaxhighlight lang="llvm">@msg_main = internal constant [13 x i8] c"Program: %s\0A\00"
 
declare i32 @printf(i8* noalias nocapture, ...)
Line 576 ⟶ 1,239:
 
ret i32 0
}</langsyntaxhighlight>
 
=={{header|Lua}}==
Lua's arg is like C's argv.
 
<langsyntaxhighlight lang="lua">#!/usr/bin/env lua
 
function main(arg)
Line 592 ⟶ 1,255:
else
module(..., package.seeall)
end</langsyntaxhighlight>
 
=={{header|MathematicaM2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
Module Checkit {
Declare GetModuleFileName Lib "kernel32.GetModuleFileNameW" {Long hModule, &lpFileName$, Long nSize}
a$=string$(chr$(0), 260)
namelen=GetModuleFileName(0, &a$, 260)
a$=left$(a$, namelen)
\\ normally m2000.exe is the caller of m2000.dll, the activeX script language
Print Mid$(a$, Rinstr(a$, "\")+1)="m2000.exe"
}
Checkit
\\ command$ return the file's path plus name of script
\\ we can use edit "callme.gsb" to paste these, and use USE callme to call it from M2000 console.
Module SayIt {
Show
Print command$
a$=key$
}
SayIt
</syntaxhighlight>
 
=={{header|Make}}==
 
<syntaxhighlight lang="make">NAME=$(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
 
all:
<lang mathematica>#!/usr/bin/env MathKernel -script
@echo $(NAME)
</syntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">#!/usr/bin/env MathKernel -script
ScriptName[] = Piecewise[
{
Line 604 ⟶ 1,294:
$CommandLine[[Position[$CommandLine, "-script", 1][[1,1]] + 1]]
]
 
Program = ScriptName[];
Print["Program: " <> Program]</syntaxhighlight>
 
=={{header|Mercury}}==
 
<syntaxhighlight lang="mercury">:- module program_name.
:- interface.
 
:- import_module io.
:- pred main(io::di, io::uo) is det.
 
:- implementation.
Print["Program: " <> Program]</lang>
 
main(!IO) :-
% The first argument is used as the program name if it is not otherwise
% available. (We could also have used the predicate io.progname_base/4
% if we did not want path preceding the program name.)
io.progname("", ProgName, !IO),
io.print_line(ProgName, !IO).
 
:- end_module program_name.</syntaxhighlight>
 
=={{header|Mozart/Oz}}==
 
Makefile:
<langsyntaxhighlight lang="make">all: test
 
test: scriptname
Line 622 ⟶ 1,329:
clean:
-rm scriptname
-rm *.exe</langsyntaxhighlight>
 
scriptname.oz:
<langsyntaxhighlight lang="oz">functor
import
System
Line 636 ⟶ 1,343:
end
end
</syntaxhighlight>
</lang>
 
=={{header|NASM assemblyNanoquery}}==
<syntaxhighlight lang="nanoquery">println args[1]</syntaxhighlight>
{{out}}
<pre>programname.nq</pre>
 
==={{header|LinuxNemerle}}===
<syntaxhighlight lang="nemerle">using System.Environment;
Makefile:
...
<lang make>FORMAT=-f elf
def program_name = GetCommandLineArgs()[0];
RUN=./
...</syntaxhighlight>
BIN=scriptname
OBJ=scriptname.o
 
all: test
 
test: $(BIN)
$(RUN)$(BIN)
 
$(BIN): $(OBJ)
ld -o $(BIN) $(OBJ)
 
$(OBJ): scriptname.asm
nasm $(FORMAT) -o $(OBJ) scriptname.asm
 
clean:
-rm $(BIN)
-rm $(OBJ)</lang>
 
scriptname.asm:
<lang nasm>bits 32
 
section .data
 
stdout equ 1
 
sys_write equ 4
sys_exit equ 1
 
kernel equ 0x80
 
program db "Program: ", 0
programlen equ $-program
 
nl db "", 10, 0
nllen equ $-nl
 
section .bss
 
scriptname resd 1
scriptnamelen resd 1
 
section .text
 
global _start
 
strlen: ; eax: a string ending in 0
push eax ; cache eax
 
.strloop:
mov bl, byte [eax]
cmp bl, 0
je .strret ; return len if bl == 0
inc eax ; else eax++
jmp .strloop
 
.strret:
pop ebx ; ebx = cached eax
sub eax, ebx ; eax -= ebx
ret ; eax = len
 
_start:
mov eax, esp
add eax, 4
mov eax, [eax]
mov dword [scriptname], eax
 
mov eax, sys_write
mov ebx, stdout
mov ecx, program
mov edx, programlen
int kernel
 
mov dword eax, [scriptname]
call strlen
mov dword [scriptnamelen], eax
 
mov eax, sys_write
mov ebx, stdout
mov dword ecx, [scriptname]
mov dword edx, [scriptnamelen]
int kernel
 
mov eax, sys_write
mov ebx, stdout
mov ecx, nl
mov edx, nllen
int kernel
 
mov eax, sys_exit
mov ebx, 0
int kernel</lang>
 
==={{header|FreeBSD/Mac OS X}}===
Makefile:
<lang make># FreeBSD defaults
 
FORMAT=-f elf
RUN=./
BIN=scriptname
OBJ=scriptname.o
 
# Mac OS X
ifeq ($(shell uname -s),Darwin)
FORMAT=-f macho
MINV=-macosx_version_min 10.6
endif
 
all: test
 
test: $(BIN)
$(RUN)$(BIN)
 
$(BIN): $(OBJ)
ld -o $(BIN) $(MINV) $(OBJ)
 
$(OBJ): scriptname.asm
nasm $(FORMAT) -o $(OBJ) scriptname.asm
 
clean:
-rm $(BIN)
-rm $(OBJ)</lang>
 
scriptname.asm:
<lang nasm>bits 32
 
section .data
 
stdout equ 1
 
sys_write equ 4
sys_exit equ 1
 
kernel equ 0x80
 
program db "Program: ", 0
programlen equ $-program
 
nl db "", 10, 0
nllen equ $-nl
 
section .bss
 
scriptname resd 1
scriptnamelen resd 1
 
section .text
 
global start
 
strlen: ; eax: a string ending in 0
push eax ; cache eax
 
.strloop:
mov bl, byte [eax]
cmp bl, 0
je .strret ; return len if bl == 0
inc eax ; else eax++
jmp .strloop
 
.strret:
pop ebx ; ebx = cached eax
sub eax, ebx ; eax -= ebx
ret ; eax = len
 
start:
mov eax, esp
add eax, 4
mov eax, [eax]
mov dword [scriptname], eax
 
push programlen
push program
push stdout
mov eax, sys_write
sub esp, 4
int kernel
add esp, 4 + 4 * 3
 
mov dword eax, [scriptname]
call strlen
mov dword [scriptnamelen], eax
 
push dword [scriptnamelen]
push dword [scriptname]
push stdout
mov eax, sys_write
sub esp, 4
int kernel
add esp, 4 + 4 * 3
 
push nllen
push nl
push stdout
mov eax, sys_write
sub esp, 4
int kernel
add esp, 4 + 4 * 3
 
push 0
mov eax, sys_exit
sub esp, 4
int kernel</lang>
 
==={{header|Windows}}===
Makefile:
<lang make>FORMAT=-f win32
BIN=scriptname.exe
OBJ=scriptname.obj
RUN=
 
all: test
 
test: $(BIN)
$(RUN)$(BIN)
 
$(BIN): $(OBJ)
golink /fo $(BIN) $(OBJ) /console kernel32.dll Msvcrt.dll
 
$(OBJ): scriptname.asm
nasm $(FORMAT) -o $(OBJ) scriptname.asm
 
clean:
-rm $(BIN)
-rm $(OBJ)</lang>
 
scriptname.asm:
<lang nasm>bits 32
 
section .data
 
program db "Program: ", 0
programlen equ $-program
 
nl db "", 13, 10, 0
nllen equ $-nl
 
stdouthandle equ -11
 
section .bss
 
stdout resd 1
 
charswritten resd 1
 
env resd 1
argc resd 1
argv resd 255
 
scriptname resd 1
scriptnamelen resd 1
 
section .text
 
global Start
extern GetStdHandle
extern __getmainargs
extern WriteConsoleA
extern ExitProcess
 
strlen: ; eax: a string ending in 0
push eax ; cache eax
 
.strloop:
mov bl, byte [eax]
cmp bl, 0
je .strret ; return len if bl == 0
inc eax ; else eax++
jmp .strloop
 
.strret:
pop ebx ; ebx = cached eax
sub eax, ebx ; eax -= ebx
ret ; eax = len
 
Start:
push 0
push env
push argv
push argc
call __getmainargs
mov eax, [argv]
mov eax, [eax]
mov [scriptname], eax
add esp, 4 * 4
 
push stdouthandle
call GetStdHandle
mov [stdout], eax
add esp, 4 * 1
 
push 0
push charswritten
push programlen
push program
push dword [stdout]
call WriteConsoleA
add esp, 4 * 5
 
mov eax, [scriptname]
call strlen
mov [scriptnamelen], eax
 
push 0
push charswritten
push dword [scriptnamelen]
push dword [scriptname]
push dword [stdout]
call WriteConsoleA
add esp, 4 * 5
 
push 0
push charswritten
push nllen
push nl
push dword [stdout]
call WriteConsoleA
add esp, 4 * 5
 
push 0
call ExitProcess</lang>
 
=={{header|NetRexx}}==
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref symbols nobinary
 
Line 974 ⟶ 1,365:
say 'Program:' System.getProperty('sun.java.command')
return
</syntaxhighlight>
</lang>
'''Output'''
 
Line 994 ⟶ 1,385:
newLISP has a function, (main-args int) for this.
 
<langsyntaxhighlight lang="lisp">#!/usr/bin/env newlisp
 
(let ((program (main-args 1)))
(println (format "Program: %s" program))
(exit))</langsyntaxhighlight>
 
=={{header|Nim}}==
<syntaxhighlight lang="nim">import os
echo getAppFilename() # Prints the full path of the executed file
echo paramStr(0) # Prints argv[0]</syntaxhighlight>
 
=={{header|Oberon-2}}==
Works with oo2c Version 2
<syntaxhighlight lang="oberon2">
MODULE ProgramName;
IMPORT
NPCT:Args,
Out;
BEGIN
Out.Object("Program name: " + Args.Get(0));Out.Ln
END ProgramName.
</syntaxhighlight>
Output:
<pre>
Program name: ./ProgramName
</pre>
 
=={{header|Objective-C}}==
Line 1,004 ⟶ 1,416:
scriptname.m:
 
<langsyntaxhighlight lang="objc">#import <Foundation/Foundation.h>
 
int main(int argc, char **argv) {
@autoreleasepool {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
char *program = argv[0];
printf("Program: %s\n", program);
 
// Alternatively:
NSString *program2 = [[NSProcessInfo processInfo] processName];
NSLog(@"Program: %@\n", program2);
 
}
[pool drain];
 
return 0;
}</langsyntaxhighlight>
 
<langsyntaxhighlight lang="sh">$ gcc -o scriptname -framework foundation scriptname.m
$ ./scriptname
Program: ./scriptname</langsyntaxhighlight>
 
=={{header|OCaml}}==
 
<langsyntaxhighlight lang="ocaml">let () =
print_endline Sys.executable_name;
print_endline Sys.argv.(0)</langsyntaxhighlight>
 
<pre>
Line 1,049 ⟶ 1,461:
 
=={{header|Octave}}==
<langsyntaxhighlight lang="octave">function main()
program = program_name();
printf("Program: %s", program);
endfunction
 
main();</langsyntaxhighlight>
 
=={{header|Ol}}==
First argument of *vm-args* is an executing program name.
<syntaxhighlight lang="scheme">
(print (car *vm-args*))
</syntaxhighlight>
 
=={{header|Order}}==
This is relatively trivial in Order, as the program being executed is a macro expression in the current C program file being read by the compiler:
<syntaxhighlight lang ="c">__FILE__</langsyntaxhighlight>
When including another file containing another <code>ORDER_PP</code> expression, within that file the <code>__FILE__</code> macro will expand to the name of that file; but arguably that expression constitutes a separate Order program within the greater C project.
 
=={{header|PARI/GP}}==
GP does not have access to the name of the program running (especially since it is usually run from the REPL gp). PARI has the same access to <code>argv[0]</code> as [[#C|C]].
 
=={{header|Pascal}}==
 
<langsyntaxhighlight lang="pascal">program ScriptName;
var
prog : String;
Line 1,070 ⟶ 1,491:
write('Program: ');
writeln(prog)
end.</langsyntaxhighlight>
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">#!/usr/bin/env perl
 
use strict;
Line 1,083 ⟶ 1,504:
}
 
unless(caller) { main; }</langsyntaxhighlight>
 
<code>$0</code> includes the full path if a script is run as say <code>perl /some/dir/foo.pl</code>. The <code>FindBin</code> module can give just the basename. This can be good for printing in diagnostics etc.
=={{header|Perl 6}}==
<syntaxhighlight lang="perl">use FindBin;
In Perl 6, the name of the program being executed is in the special global variable <tt>$*PROGRAM_NAME</tt>.
print "Program name $FindBin::Script\n";</syntaxhighlight>
<lang perl6>say $*PROGRAM_NAME;</lang>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">cl2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">command_line</span><span style="color: #0000FF;">()[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">cl2</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- full path</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">get_file_name</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cl2</span><span style="color: #0000FF;">))</span> <span style="color: #000080;font-style:italic;">-- eg test.exw or test.exe or test.htm</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">get_file_base</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cl2</span><span style="color: #0000FF;">))</span> <span style="color: #000080;font-style:italic;">-- eg test</span>
<!--</syntaxhighlight>-->
 
=={{header|Phixmonti}}==
<syntaxhighlight lang="phixmonti">argument 1 get ?</syntaxhighlight>
 
=={{header|PHP}}==
PHP has a global dictionary for this.
 
<langsyntaxhighlight lang="php"><?php
$program = $_SERVER["SCRIPT_NAME"];
echo "Program: $program\n";
?></langsyntaxhighlight>
 
=={{header|PicoLisp}}==
The function '[http://software-lab.de/doc/refC.html#cmd cmd]' returns the command name.
<langsyntaxhighlight PicoLisplang="picolisp">: (cmd)
-> "/usr/bin/picolisp"</langsyntaxhighlight>
 
=={{header|PowerBASIC}}==
Line 1,106 ⟶ 1,539:
Previous versions of PowerBASIC ([[PB/Win]] 8 or older; [[PB/CC]] 4 or older) have to make an [[API]] call:
 
<langsyntaxhighlight lang="powerbasic">#INCLUDE "Win32API.inc"
'[...]
DIM fullpath AS ASCIIZ * 260, appname AS STRING
Line 1,114 ⟶ 1,547:
ELSE
appname = fullpath
END IF</langsyntaxhighlight>
 
{{works with|PowerBASIC for Windows|9}}
Line 1,120 ⟶ 1,553:
 
Recent versions of PowerBASIC provide the <code>EXE</code> object; <code>EXE.NAME$</code> returns the program's name, while <code>EXE.NAMEX$</code> returns the program's name and extension. (<code>EXE.EXTN$</code> returns the extension only.) So, to get the program's name, we do this:
<langsyntaxhighlight lang="powerbasic">appname = EXE.NAMEX$</langsyntaxhighlight>
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
# write this in file <program.ps1>
$MyInvocation.MyCommand.Name
# launch with <.\program>
</syntaxhighlight>
<b>Output:</b>
<pre>
program.ps1
</pre>
 
=={{header|Prolog}}==
<syntaxhighlight lang="prolog">% SWI-Prolog version 8.0.0 for i686-linux.
% This will find itself, and return the knowledge base it is in.
file_name(F) :- true
, M = user % M is the module .
, P = file_name(_) % P is the predicate .
, source_file(M:P, F) % F is the file .
, \+ predicate_property(M:P, imported_from(_))
.</syntaxhighlight>
 
Alternatively, you may prefer a list of all your knowledge bases; adding the following code to each of your knowledge bases will allow you to query <code>findall(F, source_file(this_is_one_of_my_files, F), L).</code>.
<syntaxhighlight lang="prolog">:- multifile(this_is_one_of_my_files). this_is_one_of_my_files.</syntaxhighlight>
 
=={{header|PureBasic}}==
PureBasic provides a way to retrieve the filename of the program being executed. It includes the file's path.
<langsyntaxhighlight PureBasiclang="purebasic">If OpenConsole()
PrintN(ProgramFilename())
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input()
CloseConsole()
EndIf</langsyntaxhighlight>
Sample output when executing the above program compiled to an executible file called 'program name.exe':
<pre>H:\Data\Rosetta Code\program name.exe</pre>
Line 1,136 ⟶ 1,593:
Python has at least two ways to get the script name: the traditional ARGV and the inspect module.
 
<langsyntaxhighlight lang="python">#!/usr/bin/env python
 
import sys
 
def main():
program = sys.argv[0]
print print("Program: %s" % program)
 
if __name__ == "__main__":
main()</langsyntaxhighlight>
 
 
<langsyntaxhighlight lang="python">#!/usr/bin/env python
 
import inspect
 
def main():
program = inspect.getfile(inspect.currentframe())
print print("Program: %s" % program)
 
if __name__ == "__main__":
main()</langsyntaxhighlight>
 
=={{header|R}}==
R's syntax is complicated, but doable.
 
<langsyntaxhighlight Rlang="r">#!/usr/bin/env Rscript
 
getProgram <- function(args) {
Line 1,173 ⟶ 1,630:
cat("Program: ", program, "\n")
 
q("no")</langsyntaxhighlight>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">#!/usr/bin/env racket
#lang racket
 
(define (program) (find-system-path 'run-file))
 
(module+ main (printf "Program: ~a\n" (program)))</langsyntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|rakudo|2015-10-16}}
In Raku, the name of the program being executed is in the special global variable <tt>$*PROGRAM-NAME</tt>.
<syntaxhighlight lang="raku" line>say $*PROGRAM-NAME;</syntaxhighlight>
 
=={{header|Raven}}==
<syntaxhighlight lang="raven">ARGS list " " join "%s\n" print</syntaxhighlight>
{{out}}
<pre>raven arg_file.rv</pre>
 
=={{header|REXX}}==
The [[REXX|Rexx]] <code>PARSE SOURCE</code> instruction parses data describing the source of the program running.
The language processor returns a string that does not change while the program is running.
The source string contains operating system name, followed by either <code>COMMAND</code>, <code>FUNCTION</code>, or
<code>SUBROUTINE</code>, or <code>METHOD</code>, depending on whether the program was called as a host command or from a
function call in an expression or using the <code>CALL</code> instruction. or as a method of an object.
These two tokens are followed by the complete path specification of the program file.
<br><br>It should be noted that the format of the complete path varies depending upon the operating system.
 
<langsyntaxhighlight REXXlang="rexx">/* Rexx */
 
Parse source . . pgmPath
Say pgmPath
</syntaxhighlight>
</lang>
;Output
<pre>
Line 1,205 ⟶ 1,673:
REXX does not support the use of arg(0) to access the program name. A workaround is to use a shell wrapper script to obtain and provide the invocation name of the wrapper:
 
<langsyntaxhighlight lang="sh">#!/bin/sh
rexxbit.rexx $0 $*</langsyntaxhighlight>
 
Here is a rexx script that makes use of this:
 
<langsyntaxhighlight lang="rexx">say "The program is called " arg(1)</langsyntaxhighlight>
 
On TSO, this program
<langsyntaxhighlight lang="rexx">/*REXX program RANG1 in PDS N561985.PRIV.CLIST W. Pachl */
Parse Source a b c
Say 'a='a
Say 'b='!!b
Say 'c='c </langsyntaxhighlight>
yields
<pre>
Line 1,227 ⟶ 1,695:
===version with various types of invokes===
Used under Windows/XP and Windows 7 with the following REXXes:
:::* Brexx
* R4 REXX
:::* REGINAR4 REXX
:::* PersonalREGINA REXX
:::* ROOPersonal REXX
:::* ROO REXX
<lang rexx>/*REXX pgm displays the name (& possible path) of the REXX program name.*/
:::* ooRexx
<syntaxhighlight lang="rexx">/*REXX pgm displays the name (& possible path) of the REXX program name.*/
parse version _version
parse source _system _howInvoked _path
Line 1,245 ⟶ 1,715:
call prog_nam , 'subroutine' /*call ourself as a subroutine. */
zz = prog_nam( , 'function') /* " " " " function. */
/*stick a fork in it, we're done.*/</langsyntaxhighlight>
'''output''' &nbsp; when using '''R4 REXXBREXX''' with the input of: &nbsp; <tt> command </tt>
<pre>
<pre style="overflow:scroll">
───────────────────────────────────────────brexx 2.1.0 Mar 11 2003 ◄──► command
───────────────────────────────────────────REXX-r4 4.00 3 Jul 2012 ◄──► command
REXX's name of system being used: MSDOS
how the REXX program was invoked: COMMAND
name of the REXX program and path: prog_nam.rex J:\-\BREXX\REXX16.EXE D:\WIN
DOWS\SYSTEM32\COMMAND.COM
────────────────────────────────────────brexx 2.1.0 Mar 11 2003 ◄──► subroutine
REXX's name of system being used: MSDOS
how the REXX program was invoked: PROCEDURE
name of the REXX program and path: prog_nam.rex J:\-\BREXX\REXX16.EXE D:\WIN
DOWS\SYSTEM32\COMMAND.COM
──────────────────────────────────────────brexx 2.1.0 Mar 11 2003 ◄──► function
REXX's name of system being used: MSDOS
how the REXX program was invoked: FUNCTION
name of the REXX program and path: prog_nam.rex J:\-\BREXX\REXX16.EXE D:\WIN
DOWS\SYSTEM32\COMMAND.COM
</pre>
Output note (above): &nbsp; note that the wrap-around of the output is an artifact of the BREXX interpreter, not the pasting of this output.
<br><br>
 
'''output''' &nbsp; when using '''R4 REXX''' with the input of: &nbsp; <tt> command </tt>
<pre>
─────────────────────────────────────────────────REXX-r4 4.00 16 Aug 2015 ◄──► command
REXX's name of system being used: Win32
how the REXX program was invoked: COMMAND
name of the REXX program and path: DC:\PROG_NAM.REX * * PROG_NAM
────────────────────────────────────────REXX───────────────────────────────────────REXX-r4 4.00 316 JulAug 20122015 ◄──► subroutine
REXX's name of system being used: Win32
how the REXX program was invoked: SUBROUTINE
name of the REXX program and path: DC:\PROG_NAM.REX * * PROG_NAM
─────────────────────────────────────────REXX-r4 4.00 16 Aug 2015 ◄──► function
──────────────────────────────────────────REXX-r4 4.00 3 Jul 2012 ◄──► function
REXX's name of system being used: Win32
how the REXX program was invoked: FUNCTION
name of the REXX program and path: DC:\PROG_NAM.REX * * PROG_NAM
</pre>
'''output''' &nbsp; when using '''REGINA REXX''' with the input of: &nbsp; <tt> command </tt>
<pre>
<pre style="overflow:scroll">
──────────────────────────────REXX────────────────────────────────────REXX-Regina_3.79.1(MT) 5.00 145 OctApr 20122015 ◄──► command
REXX's name of system being used: WIN32
how the REXX program was invoked: COMMAND
name of the REXX program and path: Dc:\prog_nam.rex
───────────────────────────REXX──────────────────────────REXX-Regina_3.79.1(MT) 5.00 145 OctApr 20122015 ◄──► subroutine
REXX's name of system being used: WIN32
how the REXX program was invoked: SUBROUTINE
name of the REXX program and path: Dc:\PROG_NAM.rex
─────────────────────────────REXX────────────────────────────REXX-Regina_3.79.1(MT) 5.00 145 OctApr 20122015 ◄──► function
REXX's name of system being used: WIN32
how the REXX program was invoked: FUNCTION
name of the REXX program and path: Dc:\PROG_NAM.rex
</pre>
'''output''' &nbsp; when using '''Personal REXX''' with the input of: &nbsp; <tt> command </tt>
<pre>
<pre style="overflow:scroll">
────────────────────────────────────REXX/Personal 4.00 21 Mar 1992 ◄──► command
REXX's name of system being used: PCDOS
Line 1,291 ⟶ 1,782:
name of the REXX program and path: D:\PROG_NAM.REX
</pre>
'''output''' &nbsp; when using '''ROO REXX''' with the input of: &nbsp; <tt> command </tt>
<pre>
<pre style="overflow:scroll">
─────────────────────────────────────────REXX-roo 4.00 28 Jan 2007 ◄──► command
REXX's name of system being used: Win32
Line 1,306 ⟶ 1,797:
name of the REXX program and path: D:\PROG_NAM.REX * * PROG_NAM
</pre>
'''output''' &nbsp; when using '''ooRexx''' with the input of: &nbsp; <tt> command </tt>
<pre>
-----------------------------------REXX-ooRexx_4.1.2(MT) 6.03 28 Aug 2012 ?--?
REXX's name of system being used: WindowsNT
how the REXX program was invoked: COMMAND
name of the REXX program and path: E:\PROG_NAM.REX
-------------------------REXX-ooRexx_4.1.2(MT) 6.03 28 Aug 2012 ?--? subroutine
REXX's name of system being used: WindowsNT
how the REXX program was invoked: SUBROUTINE
name of the REXX program and path: E:\PROG_NAM.REX
---------------------------REXX-ooRexx_4.1.2(MT) 6.03 28 Aug 2012 ?--? function
REXX's name of system being used: WindowsNT
how the REXX program was invoked: FUNCTION
name of the REXX program and path: E:\PROG_NAM.REX
</pre>
Output note of ooRexx (which should be shown in the ooRexx language section): &nbsp; the output from ooRexx (in this Classic REXX section) needs to be corrected and re-done; &nbsp; the title is different, it is not showing the argument supplied, and it's incorrectly translating the (solid) left and right arrow characters.
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
see "Active Source File Name : " + filename() + nl
</syntaxhighlight>
output
<syntaxhighlight lang="ring">
Active Source File Name : tests\filename.ring
</syntaxhighlight>
 
Check the main file in the program
<syntaxhighlight lang="ring">
if sysargv[2] = filename()
see "I'm the main program file!" + nl
# we can run tests here!
else
see "I'm a sub file in a program" + nl
ok
</syntaxhighlight>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">#!/usr/bin/env ruby
 
puts "Path: #{$PROGRAM_NAME}" # or puts "Path: #{$0}"
puts "Name: #{File.basename $0}"</langsyntaxhighlight>
 
For example,
Line 1,329 ⟶ 1,855:
scriptname.rs:
 
<langsyntaxhighlight lang="rust">fn main() {
io::println(fmt!("Program: %s{}", osstd::env::args()[0].next().unwrap());
}</langsyntaxhighlight>
 
Example:
 
<langsyntaxhighlight lang="sh">$ rustc scriptname.rs
$ ./scriptname
Program: ./scriptname</langsyntaxhighlight>
 
=={{header|SAC}}==
Line 1,343 ⟶ 1,869:
scriptname.sac:
 
<langsyntaxhighlight lang="c">use StdIO: all;
use Array: all;
use String: { string };
Line 1,352 ⟶ 1,878:
printf("Program: %s\n", program);
return(0);
}</langsyntaxhighlight>
 
Makefile:
 
<langsyntaxhighlight lang="make">all: scriptname
 
scriptname: scriptname.sac
Line 1,363 ⟶ 1,889:
clean:
-rm scriptname
-rm scriptname.c</langsyntaxhighlight>
 
Example:
 
<langsyntaxhighlight lang="sh">$ make
sac2c -o scriptname scriptname.sac
$ ./scriptname
Program: ./scriptname</langsyntaxhighlight>
 
=={{header|Scala}}==
<syntaxhighlight lang="scala">object ScriptName extends App {
Works in interpreted, compiled, and manually interpreted modes.
println(s"Program of instantiated object: ${this.getClass.getName}")
 
// Not recommended, due various implementations
Example:
println(s"Program via enviroment: ${System.getProperty("sun.java.command")}")
 
}</syntaxhighlight>
<lang sh>$ scala ScriptName.scala
Program: ScriptName.scala
 
$ scalac ScriptName.scala
$ scala -classpath . ScriptName
Program: ScriptName.scala
 
$ scala
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.
 
scala> :load ScriptName.scala
Loading ScriptName.scala...
import scala.util.matching.Regex.MatchIterator
defined module ScriptName
 
scala> ScriptName.main(Array[String]())
Program: <console></lang>
 
ScriptName.scala:
 
<lang scala>import scala.util.matching.Regex.MatchIterator
 
object ScriptName {
val program = {
val filenames = new RuntimeException("").getStackTrace.map { t => t.getFileName }
val scala = filenames.indexOf("NativeMethodAccessorImpl.java")
if (scala == -1)
"<console>"
else
filenames(scala - 1)
}
 
def main(args: Array[String]) {
val prog = program
println("Program: " + prog)
}
}</lang>
 
=={{header|Scheme}}==
Line 1,422 ⟶ 1,909:
Getting the program name is tricky. When interpreted, the script name will be printed. When compiled, the executable name will be printed.
 
<langsyntaxhighlight lang="scheme">#!/bin/sh
#|
exec csi -ss $0 ${1+"$@"}
Line 1,446 ⟶ 1,933:
 
(if (equal? (car (program)) 'compiled)
(main (cdr (argv))))</langsyntaxhighlight>
 
=={{header|Seed7}}==
Line 1,453 ⟶ 1,940:
When the program is compiled this is the path of the executable.
The functions ''dir(PROGRAM)'' and ''file(PROGRAM)'' deliver the directory respectivly file name of the program path.
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const proc: main is func
Line 1,462 ⟶ 1,949:
writeln("Program directory: " <& dir(PROGRAM));
writeln("Program file: " <& file(PROGRAM));
end func;</langsyntaxhighlight>
 
Output when the program is interpreted:
Line 1,477 ⟶ 1,964:
Program file: programname
</pre>
 
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">say __MAIN__;
if (__MAIN__ != __FILE__) {
say "This file has been included!";
}</syntaxhighlight>
 
=={{header|Smalltalk}}==
Line 1,483 ⟶ 1,976:
Note that this only works when run as "./scriptname.st", because the shebang must force the script name onto ARGV.
 
<langsyntaxhighlight lang="smalltalk">"exec" "gst" "-f" "$0" "$0" "$@"
"exit"
 
Line 1,490 ⟶ 1,983:
program := Smalltalk getArgv: 1.
 
Transcript show: 'Program: ', program; cr.</langsyntaxhighlight>
 
{{works with|Smalltalk/X}}
Works when run in script mode or in a workspace.
 
<langsyntaxhighlight lang="smalltalk">| program |
 
program := Smalltalk commandLine first.
Transcript show: 'Program: ', program; cr.</langsyntaxhighlight>
 
=={{header|Standard ML}}==
<langsyntaxhighlight lang="sml">#!/usr/bin/env sml
 
let
Line 1,507 ⟶ 2,000:
in
print ("Program: " ^ program ^ "\n")
end;</langsyntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">#!/usr/bin/env tclsh
 
proc main {args} {
Line 1,519 ⟶ 2,012:
if {$::argv0 eq [info script]} {
main {*}$::argv
}</langsyntaxhighlight>
 
=={{header|Transd}}==
<syntaxhighlight lang="Scheme">#lang transd
 
MainModule: {
_start: (λ
(textout (get @progArgs 0))
)
}</syntaxhighlight>
 
=={{header|TXR}}==
 
Given this code in <code>program-name.txr</code>, marked executable:
 
<syntaxhighlight lang="txr">#!/usr/local/bin/txr -B
@(bind my-name @self-path)</syntaxhighlight>
 
If we run it as an executable:
 
<pre>$ ./program-name.txr
my-name="./program-name.txr"</pre>
 
If we pass it as an argument to <code>txr</code>:
 
<pre>$ txr program-name.txr
my-name="program-name.txr"</pre>
 
If we evaluate the same thing on the command line:
 
<pre>$ txr -c '@(bind my-name @self-path)'
my-name="cmdline"</pre>
 
If we pass in the code on standard input:
 
<pre>$ txr -
@(bind my-name @self-path)
my-name="stdin"</pre>
 
=={{header|UNIX Shell}}==
{{works with|Bourne Shell}}
<langsyntaxhighlight lang="bash">#!/bin/sh
 
echo "Program: $0"</langsyntaxhighlight>
 
=={{header|Vala}}==
Get name of program and print to console:
<langsyntaxhighlight lang="vala">
public static void main(string[] args){
string command_name = args[0];
Line 1,535 ⟶ 2,065:
stdout.printf("%s\n", command_name);
}
</syntaxhighlight>
</lang>
 
Output for program named "filename":
Line 1,545 ⟶ 2,075:
 
VBA can retrieve the name of the program hosting the VBA code using the <code>Application</code> object:
<syntaxhighlight lang ="vb">Debug.Print Application.Name</langsyntaxhighlight>
 
This is mostly useful for code that is shared between, say, [[wp:Microsoft Excel|Microsoft Excel]] and [[wp:Microsoft Word|Microsoft Word]], but has different requirements or actions depending on where it's running.
 
Wscript.Echo "FullName:",Wscript.FullName
 
=={{header|vbscript}}==
 
vbscript provides the Wscript object. Among its properties are the following:
 
<syntaxhighlight lang="vbscript">
Wscript.Echo "FullName:",Wscript.FullName
Wscript.Echo "Name:",Wscript.Name
Wscript.Echo "Path:",Wscript.Path
Wscript.Echo "ScriptFullName:",Wscript.ScriptFullName
Wscript.Echo "ScriptName:",Wscript.ScriptName
</syntaxhighlight>
 
<pre>
FullName: C:\WINDOWS\System32\CScript.exe
Name: Windows Script Host
Path: C:\WINDOWS\System32
ScriptFullName: D:\Utils\test.vbs
ScriptName: test.vbs
</pre>
 
=={{header|Visual Basic}}==
 
Visual Basic provides the <code>App</code> object, which has a property called <code>EXEName</code> that contains the program's filename ''without the extension''. (For most uses, this doesn't matter, but for code shared between, for example, a program and a screensaver, it can be important.) So, if a program is called "MyVBapp.exe", retreiving the value of <code>App.EXEName</code> would look like this:
<langsyntaxhighlight lang="vb">appname = App.EXEName 'appname = "MyVBapp"</langsyntaxhighlight>
 
Alternately, Visual Basic can make an [[API]] call:
<langsyntaxhighlight lang="vb">Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Dim fullpath As String * 260, appname As String, namelen As Long
namelen = GetModuleFileName (0, fullpath, 260)
Line 1,563 ⟶ 2,115:
Else
appname = fullpath
End If</langsyntaxhighlight>
 
=={{header|Wren}}==
Assuming we're running a script file named "Program_name.wren":
<syntaxhighlight lang="wren">import "os" for Process
 
System.print("My name is %(Process.allArguments[1])")</syntaxhighlight>
 
{{out}}
<pre>
My name is Program_name.wren
</pre>
 
=={{header|x86 Assembly}}==
{{Works with|Nasm}}
===Linux===
Makefile:
<syntaxhighlight lang="make">FORMAT=-f elf
RUN=./
BIN=scriptname
OBJ=scriptname.o
 
all: test
 
test: $(BIN)
$(RUN)$(BIN)
 
$(BIN): $(OBJ)
ld -o $(BIN) $(OBJ)
 
$(OBJ): scriptname.asm
nasm $(FORMAT) -o $(OBJ) scriptname.asm
 
clean:
-rm $(BIN)
-rm $(OBJ)</syntaxhighlight>
 
scriptname.asm:
<syntaxhighlight lang="asm">bits 32
 
section .data
 
stdout equ 1
 
sys_write equ 4
sys_exit equ 1
 
kernel equ 0x80
 
program db "Program: ", 0
programlen equ $-program
 
nl db "", 10, 0
nllen equ $-nl
 
section .bss
 
scriptname resd 1
scriptnamelen resd 1
 
section .text
 
global _start
 
strlen: ; eax: a string ending in 0
push eax ; cache eax
 
.strloop:
mov bl, byte [eax]
cmp bl, 0
je .strret ; return len if bl == 0
inc eax ; else eax++
jmp .strloop
 
.strret:
pop ebx ; ebx = cached eax
sub eax, ebx ; eax -= ebx
ret ; eax = len
 
_start:
mov eax, esp
add eax, 4
mov eax, [eax]
mov dword [scriptname], eax
 
mov eax, sys_write
mov ebx, stdout
mov ecx, program
mov edx, programlen
int kernel
 
mov dword eax, [scriptname]
call strlen
mov dword [scriptnamelen], eax
 
mov eax, sys_write
mov ebx, stdout
mov dword ecx, [scriptname]
mov dword edx, [scriptnamelen]
int kernel
 
mov eax, sys_write
mov ebx, stdout
mov ecx, nl
mov edx, nllen
int kernel
 
mov eax, sys_exit
mov ebx, 0
int kernel</syntaxhighlight>
 
===FreeBSD/Mac OS X===
Makefile:
<syntaxhighlight lang="make"># FreeBSD defaults
 
FORMAT=-f elf
RUN=./
BIN=scriptname
OBJ=scriptname.o
 
# Mac OS X
ifeq ($(shell uname -s),Darwin)
FORMAT=-f macho
MINV=-macosx_version_min 10.6
endif
 
all: test
 
test: $(BIN)
$(RUN)$(BIN)
 
$(BIN): $(OBJ)
ld -o $(BIN) $(MINV) $(OBJ)
 
$(OBJ): scriptname.asm
nasm $(FORMAT) -o $(OBJ) scriptname.asm
 
clean:
-rm $(BIN)
-rm $(OBJ)</syntaxhighlight>
 
scriptname.asm:
<syntaxhighlight lang="asm">bits 32
 
section .data
 
stdout equ 1
 
sys_write equ 4
sys_exit equ 1
 
kernel equ 0x80
 
program db "Program: ", 0
programlen equ $-program
 
nl db "", 10, 0
nllen equ $-nl
 
section .bss
 
scriptname resd 1
scriptnamelen resd 1
 
section .text
 
global start
 
strlen: ; eax: a string ending in 0
push eax ; cache eax
 
.strloop:
mov bl, byte [eax]
cmp bl, 0
je .strret ; return len if bl == 0
inc eax ; else eax++
jmp .strloop
 
.strret:
pop ebx ; ebx = cached eax
sub eax, ebx ; eax -= ebx
ret ; eax = len
 
start:
mov eax, esp
add eax, 4
mov eax, [eax]
mov dword [scriptname], eax
 
push programlen
push program
push stdout
mov eax, sys_write
sub esp, 4
int kernel
add esp, 4 + 4 * 3
 
mov dword eax, [scriptname]
call strlen
mov dword [scriptnamelen], eax
 
push dword [scriptnamelen]
push dword [scriptname]
push stdout
mov eax, sys_write
sub esp, 4
int kernel
add esp, 4 + 4 * 3
 
push nllen
push nl
push stdout
mov eax, sys_write
sub esp, 4
int kernel
add esp, 4 + 4 * 3
 
push 0
mov eax, sys_exit
sub esp, 4
int kernel</syntaxhighlight>
 
===Windows===
Makefile:
<syntaxhighlight lang="make">FORMAT=-f win32
BIN=scriptname.exe
OBJ=scriptname.obj
RUN=
 
all: test
 
test: $(BIN)
$(RUN)$(BIN)
 
$(BIN): $(OBJ)
golink /fo $(BIN) $(OBJ) /console kernel32.dll Msvcrt.dll
 
$(OBJ): scriptname.asm
nasm $(FORMAT) -o $(OBJ) scriptname.asm
 
clean:
-rm $(BIN)
-rm $(OBJ)</syntaxhighlight>
 
scriptname.asm:
<syntaxhighlight lang="asm">bits 32
 
section .data
 
program db "Program: ", 0
programlen equ $-program
 
nl db "", 13, 10, 0
nllen equ $-nl
 
stdouthandle equ -11
 
section .bss
 
stdout resd 1
 
charswritten resd 1
 
env resd 1
argc resd 1
argv resd 255
 
scriptname resd 1
scriptnamelen resd 1
 
section .text
 
global Start
extern GetStdHandle
extern __getmainargs
extern WriteConsoleA
extern ExitProcess
 
strlen: ; eax: a string ending in 0
push eax ; cache eax
 
.strloop:
mov bl, byte [eax]
cmp bl, 0
je .strret ; return len if bl == 0
inc eax ; else eax++
jmp .strloop
 
.strret:
pop ebx ; ebx = cached eax
sub eax, ebx ; eax -= ebx
ret ; eax = len
 
Start:
push 0
push env
push argv
push argc
call __getmainargs
mov eax, [argv]
mov eax, [eax]
mov [scriptname], eax
add esp, 4 * 4
 
push stdouthandle
call GetStdHandle
mov [stdout], eax
add esp, 4 * 1
 
push 0
push charswritten
push programlen
push program
push dword [stdout]
call WriteConsoleA
add esp, 4 * 5
 
mov eax, [scriptname]
call strlen
mov [scriptnamelen], eax
 
push 0
push charswritten
push dword [scriptnamelen]
push dword [scriptname]
push dword [stdout]
call WriteConsoleA
add esp, 4 * 5
 
push 0
push charswritten
push nllen
push nl
push dword [stdout]
call WriteConsoleA
add esp, 4 * 5
 
push 0
call ExitProcess</syntaxhighlight>
 
=={{header|Yabasic}}==
<syntaxhighlight lang="yabasic">print peek$("program_name")
 
s$ = system$("cd")
n = len(s$)
print left$(s$, n - 2), "\\", peek$("program_name")</syntaxhighlight>
 
=={{header|Zig}}==
<syntaxhighlight lang="zig">const std = @import("std");
 
const debug = std.debug;
const heap = std.heap;
const process = std.process;
 
pub fn main() !void {
var args = process.args();
 
const program_name = try args.next(heap.page_allocator) orelse unreachable;
defer heap.page_allocator.free(program_name);
 
debug.warn("{}\n", .{program_name});
}</syntaxhighlight>
 
=={{header|zkl}}==
C's argv is exposed to the zkl runtime so if file bbb.zkl contains:
<syntaxhighlight lang="zkl">#!/Homer/craigd/Bin/zkl
println(System.argv);</syntaxhighlight>
Then (on Unix like OSes)
<syntaxhighlight lang="zkl">./bbb.zkl
zkl bbb.zkl</syntaxhighlight>
both print
<pre>
L("/home/craigd/Projects/ZKL/Bin/zkl","bbb.zkl")
</pre>
On Unix, zkl is actually a shell script:
<syntaxhighlight lang="bash">#!/bin/sh
# A bash script to run zkl if you haven't jumped
# through all the Unix hoops to put the bits in the "right" places
# You can change zklRoot to your build directory,
# change the script name to "zkl" and put it in your bin path.
# You may need to chmod a+x <this script>
if [ -z $zklRoot ]; then
zklRoot=$HOME/ZKL
if [ ! -d $zklRoot ]; then
zklRoot=$HOME/Projects/ZKL
fi
fi
export zklRoot
#set -o noglob
LD_LIBRARY_PATH=$zklRoot/Lib $zklRoot/Bin/zkl "$@"</syntaxhighlight>
On Windows, no launch script (windows knows where the DLLs are) but argv[0] can be messed up.
 
{{omit from|EasyLang}}
{{omit from|AWK|With gawk, mawk, or nawk: ARGV[0] reports the name of the awk interpreter, not the name of the awk script. There is no variable nor shell command that provides the name of the awk script.}}
{{omit from|GUISS}}
{{omit from|Retro}}
162

edits