Functions to modify colon separated variables like $PATH
or $MANPATH
Use bics to manage this plugin
After installing bics
, install this plugin by running
bics install git://github.com/bahamas10/bash-path.git
git clone git://github.com/bahamas10/bash-path.git
cd bash-path
cat path.bash >> ~/.bashrc
exec bash
Given the following environment:
$ . path.bash
$ PATH='/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin'
You can add to $PATH
using path_add
(similar to pathmunge
):
$ path_add /my/new/bin
$ path_add /my/new/sbin before
$ echo "$PATH"
/my/new/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/my/new/bin
Duplicates are also allowed (path_add
does what you tell it to do):
$ path_add /bin
$ path_add /bin
$ path_add /bin
$ echo "$PATH"
/my/new/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/my/new/bin:/bin:/bin:/bin
You can remove from $PATH
using path_remove
:
$ path_remove /usr/local/bin
$ echo "$PATH"
/my/new/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:/my/new/bin:/bin:/bin:/bin
Removing a path that is not present is a noop:
$ path_remove /usr/local/bin
$ echo "$PATH"
/my/new/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:/my/new/bin:/bin:/bin:/bin
Duplicates are also completely removed with path_remove
:
$ path_remove /bin
$ echo "$PATH"
/my/new/sbin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:/my/new/bin
Let's add more garbage to the $PATH
:
$ path_add /bin
$ path_add /bin
$ path_add /bin
$ path_add /bin
$ path_add /bin/
$ path_add /bin////
$ path_add /some-fake-dir
$ echo "$PATH"
/my/new/sbin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:/my/new/bin:/bin:/bin:/bin:/bin:/bin/:/bin////:/some-fake-dir
Finally, path_clean
can be used to "cleanup" the path:
$ path_clean
$ echo "$PATH"
/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:/bin
path_add <path> [direction] [varname]
path_add
takes a directory name, an optional direction name (defaults to
"after" to append to list) and an optional variable name (defaults to PATH)
and adds the directory name to data stored in variable.
PATH='/bin:/sbin'
path_add /usr/bin
# PATH => '/bin:/sbin:/usr/bin'
path_add /opt/local/bin before
# PATH => '/opt/local/bin:/bin:/sbin:/usr/bin'
# The variable name can also be passed by name.
foo=''
path_add /bin after foo
# foo => '/bin'
path_remove <path> [varname]
path_remove
takes a directory name and an optional variable name (defaults to
PATH) and removes every instance of the directory name from the data stored in
the variable.
PATH='/bin:/sbin:/usr/bin:/usr/sbin'
path_remove /usr/bin
# PATH => '/bin:/sbin:/usr/sbin'
path_remove /not-found
# PATH => '/bin:/sbin:/usr/sbin'
# The variable name should be passed by name.
foo='/bin:/sbin'
path_remove /bin foo
# foo => '/sbin'
path_clean [varname]
path_clean
takes an optional variable name (defaults to PATH) and "cleans" it,
this process will:
- Remove empty elements.
- Remove relative directories.
- Remove directories that don't exist/can't be accessed (checked with
cd
). - Remove duplicates (first element stays, subsequent elements are tossed).
PATH='::/bin:/sbin:::./:../../some-path::/doesnt-exist'
path_clean
# PATH => '/bin:/sbin'
PATH='/bin:/bin//:////bin//////:/bin/dir/..::'
path_clean
# PATH => '/bin'
Each function has a print
derivative that will echo
the result instead of
setting it to the variable given.
Same usage as path_add
Same usage as path_remove
Same usage as path_clean
None
None
path_add()
- add to path, similar usage topathmunge
path_remove()
- remove from pathpath_clean()
- clean pathpath_print_add()
- add to path and print result without modificationpath_print_remove()
- remove from path and print result without modificationpath_print_clean()
- clean path and print result without modification
None
Run make test
to run the test suite:
$ make test
./test
# path_add bad args
# path_remove bad args
# path_print_add bad args
# path_print_remove bad args
# simple path_add after
# simple path_add before
# path_add
# path_remove
# path_add bad directories
# path_clean simple
# path_clean complex
# path_print_remove
# path_print_add
# path_print_clean
Syntax can also be checked (requires shellcheck
and awk
) with make check
:
$ make check
awk 'length($0) > 80 { exit(1); }' < Makefile
awk 'length($0) > 80 { exit(1); }' < path.bash
awk 'length($0) > 80 { exit(1); }' < test
shellcheck path.bash
shellcheck -e SC1091,SC2034 test
MIT License