diff --git a/Sc2046.md b/Sc2046.md new file mode 100644 index 0000000..a705c63 --- /dev/null +++ b/Sc2046.md @@ -0,0 +1,32 @@ +# Quote this to prevent word splitting + +### Problematic code: + + ls -l $(getfilename) + +### Correct code: + + # getfilename outputs 1 file + ls -l "$(getfilename)" + + # getfilename outputs multiple files, linefeed separated + getfilename | while IFS='' read -r line + do + ls -l "$line" + done + +### Rationale: + +When command expansions are unquoted, word splitting and globbing will occur. This often manifests itself by breaking when filenames contain spaces. + +Trying to fix it by adding quotes or escapes to the data will not work. Instead, quote the command substitution itself. + +If the command substitution outputs multiple pieces of data, use a loop instead. + +### Contraindications + +In rare cases you actually want word splitting, such as in + + gcc $(pkg-config --libs openssl) client.c + +This is because `pkg-config` outputs `-lssl -lcrypto`, which you want to break up by spaces into `-lssl` and `-lcrypto`. \ No newline at end of file