summaryrefslogtreecommitdiff
path: root/share/rcm.sh.in
diff options
context:
space:
mode:
authorGravatar Edd Salkield <edd@salkield.uk>2020-01-18 18:40:45 +0000
committerGravatar Mike Burns <mburns@thoughtbot.com>2020-04-03 16:21:07 -0400
commitcbc346b279b5c08b281c9901b994a58eb037a60d (patch)
tree387a6fd63a9332e43ca9f29a4b65ada39f85f45d /share/rcm.sh.in
parentf2fb351c391dca7c188a8623e71519619c2ce9a0 (diff)
Fix shell globbing bugs
There are several problems leading to the unintentional globbing issue: Firstly, within `rcup` and `rcdn`, when constructing arguments to pass to `lsrc`, the _for_ loops over the arguments do not have quoted variables, leading to globbing. I have quoted these accordingly. Secondly, `lsrc` is invoked as follows: ```sh dests_and_srcs="$(lsrc $LS_ARGS)" ``` When shells use command substitution like this, they go through two stages: - Word expansion. This is useful because it splits `LS_ARGS` back up into its constituent strings. - File name expansion. The side effect of this is to introduce globbing. You can read more about how this works [here](https://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html#sect_03_04_07). To fix this, I have passed `lsrc` and its arguments to `eval`. This involves quoting the relevant arguments, so: ```sh for dotfiles_dir in "$DOTFILES_DIRS"; do LS_ARGS="$LS_ARGS -d $dotfiles_dir" done ``` becomes ```sh for dotfiles_dir in "$DOTFILES_DIRS"; do LS_ARGS="$LS_ARGS -d \"$dotfiles_dir\"" done ``` Then `lsrc` is invoked as follows: ```sh dests_and_srcs="$(eval "lsrc $LS_ARGS")" ``` There is one final non-globbing issue: the parsing of arguments can introduce extra spaces in the variables, which then trip up the `dotfiles_dir_excludes` function. For example: ```sh I) includes="$includes $OPTARG";; ``` introduces a space if `includes` is empty or null. I have introduced the function `append_variable`, which allows two variables to be appended without introducing unnecessary whitespace. Then the additional whitespace is never added in the first place. Fixes #256.
Diffstat (limited to 'share/rcm.sh.in')
-rw-r--r--share/rcm.sh.in8
1 files changed, 8 insertions, 0 deletions
diff --git a/share/rcm.sh.in b/share/rcm.sh.in
index f7c6137..5d0a373 100644
--- a/share/rcm.sh.in
+++ b/share/rcm.sh.in
@@ -171,6 +171,14 @@ decode() {
echo "$file" | tr "$DELIMITER" " "
}
+append_variable() {
+ if [ -z "$1" ]; then
+ echo "$2"
+ else
+ echo "$1 $2"
+ fi
+}
+
: ${RCRC:=$HOME/.rcrc}
if [ -r "$RCRC" ]; then