Why is #!/usr/bin/env bash superior to #!/bin/bash?

bin/bash vs usr/bin/env bash
usr/bin/env bash: no such file or directory
shebang
bash shebang
bin/env vs usr/bin/env
usr/bin/env php
usr/bin/env python
usr/bin/env groovy

I've seen in a number of places, including recommendations on this site (What is the preferred Bash shebang?), to use #!/usr/bin/env bash in preference to #!/bin/bash. I've even seen one enterprising individual suggest using #!/bin/bash was wrong and bash functionality would be lost by doing so.

All that said, I use bash in a tightly controlled test environment where every drive in circulation is essentially a clone of a single master drive. I understand the portability argument, though it is not necessarily applicable in my case. Is there any other reason to prefer #!/usr/bin/env bashover the alternatives and, assuming portability was a concern, is there any reason using it could break functionality?


#!/usr/bin/env searches PATH for bash, and bash is not always in /bin, particularly on non-Linux systems. For example, on my OpenBSD system, it's in /usr/local/bin, since it was installed as an optional package.

If you are absolutely sure bash is in /bin and will always be, there's no harm in putting it directly in your shebang—but I'd recommend against it because scripts and programs all have lives beyond what we initially believe they will have.

What is the difference between "#!/usr/bin/env bash , called. In some situations, the first may be preferred (like running python scripts with multiple versions of python, without having to rework the executable line). So running `#!/usr/bin/env bash` instead of `#!/bin/bash` should have no effect as there are no environment variables being set or unset. I guess when `env` runs a command passed to it the PATH environment variable is used to locate the command but why there’s no information about this in the man page of `env` is a mystery for me.


scripts, /sh is an executable representing the system shell. Actually, it is usually implemented as a symbolic link pointing to the executable for whichever shell is the system shell. its simple i myself found it, just add the param after that #!/usr/bin/env bash -x – indianwebdevil May 15 '17 at 13:38 bash is almost always at /bin/bash so your shebang should be #!/bin/bash -x – Basile Starynkevitch May 15 '17 at 13:53


For invoking bash it is a little bit of overkill. Unless you have multiple bash binaries like your own in ~/bin but that also means your code depends on $PATH having the right things in it.

It is handy for things like python though. There are wrapper scripts and environments which lead to alternative python binaries being used.

But nothing is lost by using the exact path to the binary as long as you are sure it is the binary you really want.

Bash If-else statement - TecAdmin, marks are greater or equal to 80 then print “Very Good”. If the comparison is true, then the rest of the line is parsed by the Linux kernel, which makes another exec call with path /usr/bin/env python and current file as the first argument: /usr/bin/env python /path/to/script.py and this works for any scripting language that uses # as a comment character. And yes, you can make an infinite loop with:


There are a lot of systems that don't have Bash in /bin, FreeBSD and OpenBSD just to name a few. If your script is meant to be portable to many different Unices, you may want to use #!/usr/bin/env bash instead of #!/bin/bash.

Note that this does not hold true for sh; for Bourne-compliant scripts I exclusively use #!/bin/sh, since I think pretty much every Unix in existence has sh in /bin.

The Set Builtin (Bash Reference Manual), the positional parameters, or to display the names and values of shell variables. In POSIX mode, only shell variables are listed. [code]#!/bin/bash [/code]This is known as shebang , it tells the interpreter that the following lines are written for bash , so execute this file as bash script.


I would prefer wrapping the main program in a script like below to check all bash available on system. Better to have more control on the version it uses.

#! /usr/bin/env bash

# This script just chooses the appropriate bash
# installed in system and executes testcode.main

readonly DESIRED_VERSION="5"

declare all_bash_installed_on_this_system
declare bash

if [ "${BASH_VERSINFO}" -ne "${DESIRED_VERSION}" ]
then
    found=0

    all_bash_installed_on_this_system="$(\
        awk -F'/' '$NF == "bash"{print}' "/etc/shells"\
        )"

    for bash in $all_bash_installed_on_this_system
    do
        versinfo="$( $bash -c 'echo ${BASH_VERSINFO}' )"
        [ "${versinfo}" -eq "${DESIRED_VERSION}" ] && { found=1 ; break;}
    done
    if [ "${found}" -ne 1 ]
    then
        echo "${DESIRED_VERSION} not available"
        exit 1
    fi
fi

$bash main_program "$@"

Why is #!/usr/bin/env bash superior to #!/bin/bash?, I've seen in a number of places, including recommendations on this site (What is the preferred Bash shebang?), to use #!/usr/bin/env bash in preference to  Shows that the pip environment is the original python environment, not the virtualenv. The different pid verifies that a new shell is indeed being run, but the virtualenv is not activating. Also tried. PIPENV_EMULATOR=bash pipenv shell; Identical results $ pipenv --support. Pipenv version: '2018.7.1' Pipenv location: 'c:\\python37\\lib\\site


shebang - Why is #!/usr/bin/env bash superior to #!/bin , shebang - Why is #!/usr/bin/env bash superior to #!/bin/bash? - Stack Overflow. [​web search]. Original source (stackoverflow.com). Tags: bash shell linux  php,bash,drupal,terminal,macports. Do not modify files in /usr/bin. That's Apple's turf, and there are always other possibilities to avoid changing things there, especially since Apple's next update will happily revert these changes again and scripts might rely on /usr/bin/php being exactly the version Apple shipped with the OS.


What is the difference if I start bash with "/bin/bash" or "/usr/bin/env , In shell scripts one specifies language interpreter on shebang( #! ) line. As far as I know, it is recommended to use #!/usr/bin/env bash because env is always 


Default Bash 3 overriding shebang /bin/bash with brew installed , This is the main reason nowadays for using a different shebang: #!/usr/bin/env bash. Why is #!/usr/bin/env bash superior to #!/bin/bash?