Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bash on Windows - alias for exe files

I am using the Bash on Ubuntu on Windows, the way to run bash on Windows 10. I have the Creators update installed and the Ubuntu version is 16.04.

I was playing recently with things as npm, node.js and Docker and for docker I found it is possible to install it and run it in windows and just use the client part from bash, calling directly the docker.exe file from Windows's Program Files files folder. I just update my path variable to include the path to docker as PATH=$PATH:~/mnt/e/Program\ Files/Docker/ (put in .bashrc) and then I am able to run docker from bash calling docker.exe.

But hey this bash and I dont want to write .exe at the end of the commands (programs). I can simply add an alias alias docker="docker.exe", but then I want to use lets say docker-compose and I have to add another one. I was thinking about adding a script to .bashrc that would go over path variable and search for .exe files in every path specified in the path variable and add an alias for every occurance, but it does not seem to be a very clean solution (but I guess it would serve its purpose quite well).

Is there a simple and clean solution to achieve this?

like image 442
Šimon Hrabec Avatar asked Jul 19 '17 08:07

Šimon Hrabec


People also ask

How do I run an EXE file in bash?

To run a Windows program, enter the path to the program's .exe file in the Bash shell. Remember that your Windows C: drive is available at /mnt/c in Bash. The Bash environment is also case-sensitive, so you have to specify the correct capitalization.

Where are git bash aliases stored?

A global alias is stored in the global . gitconfig file which is available under the user home directory in Linux, for a local alias it is inside the . git folder within the repository, or you can say “/. git/config” is the relative path for the file.


1 Answers

I've faced the same problem when trying to use Docker for Windows from WSL.

Had plenty of existing shell scripts that run fine under Linux and mostly under WSL too until failing due to docker: command not found. Changing everywhere docker to docker.exe would be too cumbersome and non-portable.


Tried workaround with aliases in ~/.bashrc as here at first:

shopt -s expand_aliases
alias docker=docker.exe
alias docker-compose=docker-compose.exe

But it requires every script to be run in interactive mode and still doesn't work within backticks without script modification.


Then tried exported bash functions in ~/.bashrc:

docker() { docker.exe "$@"; }
export -f docker
docker-compose() { docker-compose.exe "$@"; }
export -f docker-compose

This works. But it's still too tedious to add every needed exe.


Finally ended up with easier symlinks approach and a modified wslshim custom helper script.

Just add once to ~/.local/bin/wslshim:

#!/bin/bash -x
cd ~/.local/bin && ln -s "`which $1.exe`" "$1" || ln -s "`which $1.ps1`" "$1" || ln -s "`which $1.cmd`" "$1" || ln -s "`which $1.bat`" "$1"

Make it executable: chmod +x ~/.local/bin/wslshim

Then adding any "alias" becomes as easy as typing two words:

$ wslshim docker
+ cd ~/.local/bin
++ which docker.exe
+ ln -s '/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe' docker

$ wslshim winrm
+ cd ~/.local/bin
++ which winrm.exe
+ ln -s '' winrm
ln: failed to create symbolic link 'winrm' -> '': No such file or directory
++ which winrm.ps1
+ ln -s '' winrm
ln: failed to create symbolic link 'winrm' -> '': No such file or directory
++ which winrm.cmd
+ ln -s /mnt/c/Windows/System32/winrm.cmd winrm

The script auto picks up an absolute path to any windows executable in $PATH and symlinks it without extension into ~/.local/bin which also resides in $PATH on WSL.

This approach can be easily extended further to auto link any exe in a given directory if needed. But linking the whole $PATH would be an overkill. )

like image 151
Vadzim Avatar answered Oct 14 '22 04:10

Vadzim