18

I recently noticed that many scripts are using /usr/bin/env in their shebang. I have seen that mainly using Bash and Python, but thus far never in conjunction with POSIX sh (ash, dash,...).

I wonder why, and if my, meant-to-be highly portable, POSIX shell scripts might benefit from the env approach?


Is there a general concensus on whether to use:

  • standard:

    #!/bin/sh
    
  • environment:

    #!/usr/bin/env sh
    

Let me stress this enough:

I never have seen this with sh.

15
  • 3
    On macOS, for example, /bin/bash is an antiquated POC, but one can get newer bash via homebrew. So I use #!/usr/bin/env bash if write a script for both my MBP and my Linux PC. But if I'm going to stick to POSIX, then /bin/sh is fine for both; I don't see much of a use case except in some outdated system where /bin/sh might not be a POSIX shell, in which case I doubt /usr/bin/env will work either.
    – muru
    Feb 27, 2020 at 3:51
  • 9
    unix.stackexchange.com/a/77586/70524: "There are two programs whose location you can rely on on almost every unix variant: /bin/sh and /usr/bin/env. Some obscure and mostly retired Unix variants had /bin/env without having /usr/bin/env, but you're unlikely to encounter them. Modern systems have /usr/bin/env precisely because of its widespread use in shebangs. /usr/bin/env is something you can count on."
    – muru
    Feb 27, 2020 at 3:52
  • 2
    @mosvy Which most used unix variant ever doesn't have /bin/sh?
    – Oskar Skog
    Feb 27, 2020 at 6:34
  • 3
    @muru be vary careful: a bash compiled with default parameters is not POSIX compliant, this is why Apple offers a special bash version in /bin/sh that e.g. treats echo correctly. BTW: /bin/sh is not part of POSIX. POSIX rather requires you to do: export PATH=$(getconf PATH) followed by sh to get a POSIX shell.
    – schily
    Feb 27, 2020 at 15:46
  • 2
    @vonbrand 1. POSIX does NOT mandate the existence of /bin/sh. 2. Except for some obscure Chinese SUSE (or Centos?) fork(s) (iirc), no Linux system has ever been "certified" as Unix.
    – user313992
    Feb 28, 2020 at 16:31

2 Answers 2

21

Setting to #!/bin/sh will go directly to that file /bin/sh.

Setting to #!/usr/bin/env sh will execute /usr/bin/env with an argument of sh. This will cause the script to be executed by sh in your PATH variable rather than explicitly with /bin/sh.

2
  • 1
    None of these commands will give you a POSIX shell in case your PATH is not the result from a getconf PATH call.
    – schily
    Feb 27, 2020 at 15:48
  • Nice Answer. It's a common doubt
    – Daniel
    Mar 6, 2020 at 12:25
0

Many other posts (like the accepted answer of this one) mentioned that bin/sh in Solaris system (10 or older) is NOT a POSIX-compliant shell, instead, it is under /usr/xpg4/bin/sh.

In this case #!/bin/sh might not work properly if it meant to be POSIX-compliant. However, I doubt #!/usr/bin/env sh would point to the desired shell.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .