Detect if user's path has a specific directory in it

前端 未结 8 2273
天命终不由人
天命终不由人 2020-11-28 07:13

With /bin/bash, how would I detect if a user has a specific directory in their $PATH variable?

For example

if [ -p \"$HOME/bin\" ]; then         


        
8条回答
  •  心在旅途
    2020-11-28 07:55

    I wrote the following shell function to report if a directory is listed in the current PATH. This function is POSIX-compatible and will run in compatible shells such as Dash and Bash (without relying on Bash-specific features).

    It includes functionality to convert a relative path to an absolute path. It uses the readlink or realpath utilities for this but these tools are not needed if the supplied directory does not have .. or other links as components of its path. Other than this, the function doesn’t require any programs external to the shell.

    # Check that the specified directory exists – and is in the PATH.
    is_dir_in_path()
    {
      if  [ -z "${1:-}" ]; then
        printf "The path to a directory must be provided as an argument.\n" >&2
        return 1
      fi
    
      # Check that the specified path is a directory that exists.
      if ! [ -d "$1" ]; then
        printf "Error: ‘%s’ is not a directory.\n" "$1" >&2
        return 1
      fi
    
      # Use absolute path for the directory if a relative path was specified.
      if command -v readlink >/dev/null ; then
        dir="$(readlink -f "$1")"
      elif command -v realpath >/dev/null ; then
        dir="$(realpath "$1")"
      else
        case "$1" in
          /*)
            # The path of the provided directory is already absolute.
            dir="$1"
          ;;
          *)
            # Prepend the path of the current directory.
            dir="$PWD/$1"
          ;;
        esac
        printf "Warning: neither ‘readlink’ nor ‘realpath’ are available.\n"
        printf "Ensure that the specified directory does not contain ‘..’ in its path.\n"
      fi
    
      # Check that dir is in the user’s PATH.
      case ":$PATH:" in
        *:"$dir":*)
          printf "‘%s’ is in the PATH.\n" "$dir"
          return 0
          ;;
        *)
          printf "‘%s’ is not in the PATH.\n" "$dir"
          return 1
          ;;
      esac
    }
    

    The part using :$PATH: ensures that the pattern also matches if the desired path is the first or last entry in the PATH. This clever trick is based upon this answer by Glenn Jackman on Unix & Linux.

提交回复
热议问题