#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: without-env ENVVAR PATH -- COMMAND... without-env [-h] EOF } help() { cat <<-'EOF' Options: -h, --help show this message Examples: Execute "command -V" filtering ~/bin, to get where "w3m" is in $PATH, other than ~/bin: $ without-env PATH ~/bin -- command -v w3m Compile foo.c, excluding ~/.local/include from $C_INCLUDE_PATH: $ without-env C_INCLUDE_PATH ~/.local/include -- cc -co foo.o foo.c EOF } for flag in "$@"; do case "$flag" in --) break ;; --help) usage help exit ;; *) ;; esac done while getopts 'h' flag; do case "$flag" in h) usage help exit ;; *) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) assert_arg() { if [ -z "$1" ]; then printf 'Missing %s\n' "$2" >&2 exit 2 fi } assert_arg "${1:-}" 'ENVVAR' assert_arg "${2:-}" 'PATH' assert_arg "${3:-}" '--' eval "export $1=\"\$(echo \"\$$1\" | sed \"s|\$2:||g\")\"" shift # drop $1 shift # drop $2 shift # drop -- "$@"