fish shell : exec format error

You need a shebang line if the executable file cannot be run natively by the kernel. The kernel can only run machine code in a specific format (ELF on most Unix variants), or sometimes other formats (e.g. on Linux you can register executable formats through binfmt_misc). If the executable file needs an interpreter then the kernel needs to know which interpreter to call. That's what the shebang line is for.

If your script is in fish syntax, its first line must be

#!/usr/bin/env fish

(You can use the absolute path instead, but then you'll have to modify the script if you want to run it on a machine where the fish executable is in a different location, e.g. /usr/bin/fish vs /usr/local/bin/fish.)

If your script is in sh syntax, use

#!/bin/sh

(All modern Unix systems have a POSIX sh at /bin/sh so you don't need env.)

If your script is in bash syntax (which is sh plus some bash-specific extensions), use

#!/usr/bin/env bash

On Linux, in practice, #!/bin/bash will also work.

All of this is independent of which shell you're calling the script from. All that matters is what language the script is written in.


You need to have a shebang in order to execute a script by referencing its path. Otherwise, the operating system will attempt to execute it, but will fail because it's not a binary executable file.

If you don't want to use a shebang you need to specify what should execute the script. In your case, it should be fish.

fish myscript.sh