Getting path of escript command at runtime

I have made an escript, I would like to include some sort of “usage: cmd options” help info. I have been unable to find an equivalent to “$0” in bash (I’ve been looking for a function). Is there a way to get the command path while running an escript?

Something like this?

File.cwd! |> Path.basename()

That only gets me the path of the current working directory, not necessarily the path of the escript, unless I change to the directory where the script is before running it. however I’m also interested in knowing the name of the executable that was called to run the escript. For example, with bash:

/usr/bin/bash -c 'echo $0'

results in: /usr/bin/bash

So, I get the path and the name of the executable together. If I make a script and call it /usr/local/foo, $0 in that script will become /usr/local/foo, or just foo if I don’t specify the whole path when I run it.

if my escript is placed in /usr/local/app-ctl, I’m trying to find a way that I can discover this from within the script so I don’t have to hardcode where it will end up at compile time.

If you have an escript, you can use :escript.script_name/0 to get the name of the current script. As far as I remember it behaves the same way as *ARGV in C or ${0} in bash.

So if script_name == Path.basename(scriptname), you can use :os.find_executable(script_name) to get its location. Otherwise use :filename.pathtype to determine if the path is absolute or relative and then use it directly or join with cwd.

Thats a rough draft.

2 Likes