Bash: exec – C and env_ SUPATH


Verify problems and find problems

Verify in manual pageexec -c commandThe new process will not be started, but the environment variable is empty.

Verification method:

  1. Print process IDecho $BASHPID
  2. Print environment variable pathecho $PATH
  3. Print all environment variablesexport -p

    //File test1
    set -e
    //File test2
    set -e
    echo '2==PID='$BASHPID
    echo '2==PPID='$PPID
    echo '2==PATH='$PATH
    echo '2==export=='`export -p`
    exec -c ./test3
    //File test3
    set -e
    echo '3==PID='$BASHPID
    echo '3==PPID='$PPID
    echo '3==PATH='$PATH
    echo '3==export='`export -p`
    $ ./test1
    2==export==declare -x DBUS_ SESSION_ BUS_ Address = "UNIX: path = / run / user / 1000 / bus" declare - x home = "user home directory" declare - x lang = "en_ US.UTF-8" declare -x LC_ TERMINAL="iTerm2" declare -x LC_ TERMINAL_ Version = "3.3.8" declare - x lesclose = "/ usr / bin / lescope% s% s" declare - x lesopen = "| / usr / bin / lescope% s" declare - x logname = "login user" declare - x LS_ COLORS="rs=0:di=01; 34:ln=01; 36:mh=00:pi=40; 33:so=01; 35:do=01; 35:bd=40; 33; 01:cd=40; 33; 01:or=40; 31; 01:mi=00:su=37; 41:sg=30; 43:ca=30; 41:tw=30; 42:ow=34; 42:st=37; 44:ex=01; 32:*.tar=01; 31:*.tgz=01; 31:*.arc=01; 31:*.arj=01; 31:*.taz=01; 31:*.lha=01; 31:*.lz4=01; 31:*.lzh=01; 31:*.lzma=01; 31:*.tlz=01; 31:*.txz=01; 31:*.tzo=01; 31:*.t7z=01; 31:*.zip=01; 31:*.z=01; 31:*.dz=01; 31:*.gz=01; 31:*.lrz=01; 31:*.lz=01; 31:*.lzo=01; 31:*.xz=01; 31:*.zst=01; 31:*.tzst=01; 31:*.bz2=01; 31:*.bz=01; 31:*.tbz=01; 31:*.tbz2=01; 31:*.tz=01; 31:*.deb=01; 31:*.rpm=01; 31:*.jar=01; 31:*.war=01; 31:*.ear=01; 31:*.sar=01; 31:*.rar=01; 31:*.alz=01; 31:*.ace=01; 31:*.zoo=01; 31:*.cpio=01; 31:*.7z=01; 31:*.rz=01; 31:*.cab=01; 31:*.wim=01; 31:*.swm=01; 31:*.dwm=01; 31:*.esd=01; 31:*.jpg=01; 35:*.jpeg=01; 35:*.mjpg=01; 35:*.mjpeg=01; 35:*.gif=01; 35:*.bmp=01; 35:*.pbm=01; 35:*.pgm=01; 35:*.ppm=01; 35:*.tga=01; 35:*.xbm=01; 35:*.xpm=01; 35:*.tif=01; 35:*.tiff=01; 35:*.png=01; 35:*.svg=01; 35:*.svgz=01; 35:*.mng=01; 35:*.pcx=01; 35:*.mov=01; 35:*.mpg=01; 35:*.mpeg=01; 35:*.m2v=01; 35:*.mkv=01; 35:*.webm=01; 35:*.webp=01; 35:*.ogm=01; 35:*.mp4=01; 35:*.m4v=01; 35:*.mp4v=01; 35:*.vob=01; 35:*.qt=01; 35:*.nuv=01; 35:*.wmv=01; 35:*.asf=01; 35:*.rm=01; 35:*.rmvb=01; 35:*.flc=01; 35:*.avi=01; 35:*.fli=01; 35:*.flv=01; 35:*.gl=01; 35:*.dl=01; 35:*.xcf=01; 35:*.xwd=01; 35:*.yuv=01; 35:*.cgm=01; 35:*.emf=01; 35:*.ogv=01; 35:*.ogx=01; 35:*.aac=00; 36:*.au=00; 36:*.flac=00; 36:*.m4a=00; 36:*.mid=00; 36:*.midi=00; 36:*.mka=00; 36:*.mp3=00; 36:*.mpc=00; 36:*.ogg=00; 36:*.ra=00; 36:*.wav=00; 36:*.oga=00; 36:*.opus=00; 36:*.spx=00; 36:*.xspf=00; 36:" declare -x MOTD_ Show = "PAM" declare - x oldpwd = "user directory" declare - x path = "/ usr / local / SBIN: / usr / local / bin: / usr / SBIN: / usr / bin: / SBIN: / bin: / usr / games: / usr / local / games: / snap / bin" declare - x PWD = "current directory name" declare - x shell = "/ bin / bash" declare - x shlvl = "3" declare - x SSH_ CLIENT=" 51426 22" declare -x SSH_ CONNECTION=" 51426 22" declare -x SSH_ TTY = "/ dev / PTS / 0" declare - x term = "xterm-256color" declare - x user = "username" declare - x XDG_ DATA_ DIRS="/usr/local/share:/usr/share:/var/lib/snapd/desktop" declare -x XDG_ RUNTIME_ DIR="/run/user/1000" declare -x XDG_ SESSION_ CLASS="user" declare -x XDG_ SESSION_ ID="204" declare -x XDG_ SESSION_ TYPE="tty"
    3 = = export = declare - x oldpwd declare - x PWD = "current directory name" declare - x shlvl = "1"

Observe output

test2withtest3The process ID and parent process ID of are the same, and the environment variable of the latter is the same(export -p)It can be regarded as empty(PWDIs the current directory name,SHLVLIs the shell depth).

But strangely,test3inecho $PATHIt’s not empty. It’s clearly thereexport -pNot in the output ofPATHYes.

What is the path output by query test3

  • Guess that because the environment variable is empty, it inherits a global environment variable and searches in the global environment

    $ grep -rns /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin /
    /etc/login.defs:102:ENV_SUPATH    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  • /etc/environmentThere’s only one line without extra information. Look/etc/login.defsNotes for

    #* required * the default path settings, for superuser and normal users. // necessary: set the default path for superuser and normal users respectively
    # (they are minimal, add the rest in the shell startup files)
    ENV_SUPATH      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    ENV_PATH        PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
  • An answer was also found on Bingwhat is ENV_SUPATH

reference resources