aboutsummaryrefslogtreecommitdiff
path: root/sh/shrc.d/path.sh
blob: 3caabbc913332458136fc0d747ea6460fd6693a5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# Function to manage contents of PATH variable within the current shell
path() {

    # The second argument, the directory, can never have a colon
    case $2 in
        *:*)
            printf >&2 'path(): %s illegal colon\n' "$2"
            return 2
            ;;
    esac

    # Check first argument to figure out operation
    case $1 in

        # List current directories in PATH
        list|'') (
            # shellcheck disable=SC2030
            path=$PATH:
            while [ -n "$path" ] ; do
                dir=${path%%:*}
                path=${path#*:}
                [ -n "$dir" ] || continue
                printf '%s\n' "$dir"
            done
            ) ;;

        # Add a directory at the start of $PATH
        insert)
            if path check "$2" ; then
                printf >&2 'path(): %s already in PATH\n' "$2"
                return 1
            fi
            PATH=${2}${PATH:+:"$PATH"}
            ;;

        # Add a directory to the end of $PATH
        append)
            if path check "$2" ; then
                printf >&2 'path(): %s already in PATH\n' "$2"
                return 1
            fi
            PATH=${PATH:+"$PATH":}${2}
            ;;

        # Remove a directory from $PATH
        remove)
            if ! path check "$2" ; then
                printf >&2 'path(): %s not in PATH\n' "$2"
                return 1
            fi
            PATH=$(
                path=:$PATH:
                path=${path%%:"$2":*}:${path#*:"$2":}
                path=${path#:}
                path=${path%:}
                printf '%s\n' "$path"
            )
            ;;

        # Check whether a directory is in PATH
        check)
            case :$PATH: in
                *:"$2":*) return 0 ;;
            esac
            return 1
            ;;

        # Print help output (also done if command not found)
        help)
            cat <<'EOF'
path(): Manage contents of PATH variable

USAGE:
  path [list]
    Print the current directories in PATH, one per line (default command)
  path insert DIR
    Add a directory to the front of PATH
  path append DIR
    Add a directory to the end of PATH
  path remove DIR
    Remove directory from PATH
  path check DIR
    Return whether DIR is a component of PATH
  path help
    Print this help message (also done if command not found)
EOF
            ;;

        # Command not found
        *)
            printf >&2 'path(): Unknown command\n'
            path help >&2
            return 2
            ;;
    esac
}