diff --git a/SC2046.md b/SC2046.md index be625f0..0676b51 100644 --- a/SC2046.md +++ b/SC2046.md @@ -1,19 +1,23 @@ -# Quote this to prevent word splitting +# Quote this to prevent word splitting. ### Problematic code: - ls -l $(getfilename) +```sh +ls -l $(getfilename) +``` ### Correct code: - # getfilename outputs 1 file - ls -l "$(getfilename)" +```sh +# getfilename outputs 1 file +ls -l "$(getfilename)" - # getfilename outputs multiple files, linefeed separated - getfilename | while IFS='' read -r line - do - ls -l "$line" - done +# getfilename outputs multiple files, linefeed separated +getfilename | while IFS='' read -r line +do + ls -l "$line" +done +``` ### Rationale: @@ -27,15 +31,19 @@ If the command substitution outputs multiple pieces of data, use a loop instead. In rare cases you actually want word splitting, such as in - # shellcheck disable=SC2046 - gcc $(pkg-config --libs openssl) client.c +```sh +# shellcheck disable=SC2046 +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`. A bash alternative in these cases is to use `read -a` for words or `mapfile` for lines. ksh can also use `read -a`, or a `while read` loop for lines. In this case, since `pkg-config` outputs words, you could use: - # Read words into an array in bash and ksh - read -ra args < <(pkg-config --libs openssl) - - # expand args - gcc "${args[@]}" client.c \ No newline at end of file +```sh +# Read words into an array in bash and ksh +read -ra args < <(pkg-config --libs openssl) + +# expand args +gcc "${args[@]}" client.c +``` \ No newline at end of file