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
.
/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./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."bash
compiled with default parameters is not POSIX compliant, this is why Apple offers a specialbash
version in/bin/sh
that e.g. treatsecho
correctly. BTW:/bin/sh
is not part of POSIX. POSIX rather requires you to do:export PATH=$(getconf PATH)
followed bysh
to get a POSIX shell./bin/sh
. 2. Except for some obscure Chinese SUSE (or Centos?) fork(s) (iirc), no Linux system has ever been "certified" as Unix.