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.

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 folder usr and then folder bin for the perl.exe executable.

Uniform Server format:
#!C:/UniServerZ/core/perl/bin/perl.exe

For a default installation of Uniform Server on C drive, start at the top-level of C: drive, navigate the folder tree UniServerZ, core, perl, and finally look in folder bin 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: The mklink command requires an elevated command prompt.

Creating a symbolic link to access the Perl executable

The above looks complex; in reality, it 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.

Two new files (link_create.bat and link_delete.bat) are created in folder UniServerZ upon Perl installation:

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 select Run as administrator) and 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 and select Run as administrator) to create the symbolic link. You can now start the servers either as a standard program or service.


--oOo--