I have a shell script in /usr/local/bin
#!/bin/sh
extract() {
 if [ -z "$1" ]; then
    # display usage if no parameters given
    echo "Usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>"
 elif [ -f "$1" ]; then
        case $1 in
          *.tar.bz2)   tar xvjf "$1"    ;;
          *.tar.gz)    tar xvzf "$1"    ;;
          *.tar.xz)    tar xvJf "$1"    ;;
          *.lzma)      unlzma "$1"      ;;
          *.bz2)       bunzip2 "$1"     ;;
          *.rar)       unrar x "$1"     ;;
          *.gz)        gunzip "$1"      ;;
          *.tar)       tar xvf "$1"     ;;
          *.tbz2)      tar xvjf "$1"    ;;
          *.tgz)       tar xvzf "$1"    ;;
          *.zip)       unzip "$1"       ;;
          *.Z)         uncompress "$1"  ;;
          *.7z)        7z x "$1"        ;;
          *.xz)        unxz "$1"        ;;
          *.exe)       cabextract "$1"  ;;
          *)           echo "extract: '$1' - unknown archive method" ;;
        esac
        echo "extraction successful: $1"
    else
        echo "$1 - file does not exist"
fi
}
However, it doesn't run properly unless I do source /usr/local/bin/extract in the current terminal. I know /usr/local/bin is in my path.
I have tried to change owner of the script to root:root to see if that makes a difference. File permissions are 755. I have tried to source /usr/local/bin again in my .zshenv but it was already in $PATH anyway. The only way I can make it work is if I use source /usr/local/bin/extract directly. I have tried rebooting after various changes like this. I checked the file for bashisms in shellcheck. I tried with different shebangs, #!/usr/bin/env bash and #!/bin/sh. my /bin/sh is linked to dash.
I expected any script or binary in /usr/local/bin to work without sourcing it for each terminal sessions.
