Zero logo

Unix Shebang on Windows

This page covers running Perl scripts with Unix Shebang unmodified on Windows. It allows you to easily transfer scripts between Windows and Unix systems and to run scripts from third parties that use a Unix Shebang.

Note: The implementation is for a fixed installation of Uniform Server running either as a standard program or as a service on a modern version of Windows that supports symbolic links this excludes Windows XP.

Shebang interpreter directive

The syntax of a shebang (interpreter directive) is as follows: #! interpreter [optional-arg]
Note: The #! means "use the following command/interpreter to run this script". Generally the command/interpreter is the absolute path to an executable for example:

Unix format:
#!/usr/bin/perl

Note: The forward slash is shorthand meaning top-level of the current drive. For example to find the perl.exe executable on C drive, start at the top-level of C: drive, look in in folder usr and then folder bin for the perl.exe executable.

Default installation of Uniform Server executable path is:
#!C:/UniServerZ/core/perl/bin/perl.exe

For a default instalation of Uniform Server on C drive. Start at the top-level of C: drive, navigate the folder tree UniServerZ, core, perl finally look in in folder bin a for the perl.exe executable.

Note: In both cases the .exe extension is optional, generally the Unix Shebang excludes this extension.

Symbolic link

From the above example a Unix Shebang will not find the perl.exe executable on a default installation of Uniform Server. The path /usr/bin/perl does not exist what is required is to map the Unix Shebang to the real path C:/UniServerZ/core/perl/bin/perl.exe this is achieved using a symbolic link.

Path difference
The following shows the two paths one above the other for comparison.

                 C:/usr/bin/perl.exe  - Unix path
C:/UniServerZ/core/perl/bin/perl.exe  - Uniform Server path

Starting from right to left remove common elements to give:

                 C:/usr  - Unix path
C:/UniServerZ/core/perl  - Uniform Server path

Link redirection
When searching for perl.exe, Unix Shebang directs the search to folder usr. Instead of folders in usr it finds a link and follows this. At the end of the link redirection path it appends folder bin and looks for perl.exe The link redirection is referred to as a symbolic link, it contains a real path for example "C:/UniServerZ/core/perl"

mklink syntax
A symbolic link is created with the Microsoft DOS command mklink. It has the following syntax:

mklink /d Link Target
Parameter Description
/d Creates a directory symbolic link. Default is a file symbolic link.
Link Specifies the name of the new symbolic link that is being created.
Target Specifies the path (relative or absolute) that the new symbolic link refers to.

Note 1: The mklink command is an internal command that is available in the following operating systems:

  • Windows 7
  • Windows Vista
  • Windows 8
  • Windows 10

Note 2: The mklink command requires an elevated command prompt.

Creating a symbolic link to access the Perl executable

The above looks complex in reality is is quite simple, all that is required is to map folder usr to folder path C:/UniServerZ/core/perl. using the following command line:

mklink /D usr C:\UniServerZ\core\perl
Server relocation

Uniform Server is portable and can be moved to a different location either to a different folder or hard drive by copying folder UniServerZ and all its content to the desired location. However you must remember to adjust the path accordingly in the symbolic link. This inconvenience is avoided by using two batch files.

Batch files

The following two batch files allow you to easily create and delete a symbolic link to access the Perl executable.
Create and test these batch files as follow:

Create two new files link_create.bat and link_delete.bat in folder UniServerZ with the following content:

link_create.bat
@echo off
rem working directory current folder
pushd %~dp0

rem save us path
set us_path=%cd%

rem change to top level
cd \

rem create link
mklink /D usr %us_path%\core\perl

rem restore original
popd
pause
   link_delete.bat
@echo off
rem working directory current folder
pushd %~dp0

rem save us path
set us_path=%cd%

rem change to top level
cd \

rem delete link
rd usr

rem restore original
popd
rem pause
  • pushd %~dp0: Saves return address and current location of the batch file.
  • us_path: The variable us_path is set to the current working directory. Full path of batch file location.
  • cd \: Change working directory to top-level of disk drive.
  • mklink /D usr %us_path%\core\perl:
    • usr: A link folder usr is created at the top-level of the disk drive
    • %us_path%\core\perl: Sets the link path for example
      C:/UniServerZ/core/perl
  • popd: Restore calling address and returns.

Test 1 - Apache running as a standard program

  • Run link_create.bat (right click on file link_create.bat and run as administrator) allow program to make changes. This creates a symbolic link to the Perl executable.
  • Start UniController. From the Perl tab run Force Unix Shebang you only need to perform this once.
  • From UniController start Apache and check your Perl scripts run.
  • Close Apache and UniController.

Test 2 - Apache running as a service

  • Start UniService install and run Apache.
  • Again check your Perl scripts run.

Note: To remove the link double click on file link_delete.bat

Move Server

You can move Uniform Server to a new location. First run link_delete.bat to remove the symbolic link. Move folder UniServerZ and all its content to the new location. Run link_create.bat (right click file link_create.bat run as administrator) to create the symbolic link. You can now start the servers either as a standard program or service.


--oOo--