Creating Hybrid Scripts - Leveraging the Power of Multiple Shells
You may think of command line scripts as using one specific shell or language, but depending on your environment you can combine multiple shells in a single script to leverage the advantages of each.
Hybrid bash script in Windows
If you are running Windows and have Git for Windows installed you can use the included bash shell to execute a script that integrates bash, Windows commands, and PowerShell. Here is an example:
printf 'This is bash running on Windows\n' powershell write-host "This is PowerShell" tasklist #This is a Windows command tasklist | cut -c1-25 #Windows command piped into a Linux command
Here is sample output when run from Git bash:
$ ./hybrid.sh This is bash running on Windows This is PowerShell Image Name PID Session Name Session# ========================= ======== ================ =========== System Idle Process 0 Services 0 . . .
Hybrid batch script in Windows
This same method can be used when writing a Windows batch script. The Windows Subsystem for Linux (WSL) and PowerShell can easily be accessed and integrated if installed:
echo This is a Windows command powershell write-host "This is PowerShell" wsl cowsay 'This is a Linux command using the Windows Subsystem for Linux'
Here is the output when executed from the Windows command prompt:
c:\>hybrid.bat This is a Windows command This is PowerShell ___________________________________ / This is a Linux command using the \ \ Windows Subsystem for Linux / ----------------------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
Hybrid PowerShell script in Windows
From a Windows PowerShell script you can easily access Windows commands and Linux commands if WSL is installed:
write-host "This is PowerShell" wsl cowsay This is Linux echo "This is a Windows command"
And the output when run from PowerShell:
PS C:\> .\Hybrid.ps1 This is PowerShell _______________ < This is Linux > --------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || This is a Windows command
Hybrid bash script in Linux
Finally, you can call PowerShell from a bash script in Linux if you have it installed:
printf 'This is a Linux command\n' pwsh -command write-host "This is PowerShell on Linux"
And the output when executed from Linux:
$ ./linux_hybrid.sh This is a Linux command This is PowerShell on Linux
Creating hybrid scripts is a great way to leverage the strengths of different shells. However, be aware that performance may be an issue. Every time you call a shell that is different than the one the script is natively executing in, it will create a new instance. For example, if you are executing a Windows batch script and call a Linux command using WSL it will create a temporary Linux shell to execute the command. Constantly creating and destroying shells from within a script will negatively impact performance, so avoid using this method in loops or where speed is essential.
The table below summarizes what shells your scripts have access to from a given execution environment. For example, you can access Linux, Windows, and PowerShell commands when executing a bash script on Windows using Git bash.