diff --git a/SC2046.md b/SC2046.md index 65e366d..be625f0 100644 --- a/SC2046.md +++ b/SC2046.md @@ -27,24 +27,15 @@ 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 -This is because `pkg-config` outputs `-lssl -lcrypto`, which you want to break up by spaces into `-lssl` and `-lcrypto`. An alternative is to put the variables to an array and expand it: +This is because `pkg-config` outputs `-lssl -lcrypto`, which you want to break up by spaces into `-lssl` and `-lcrypto`. - # For bash - mapfile -t args < <(pkg-config --libs openssl) - - # For ksh - pkg-config --libs openssl | while IFS="" read -r line; do array+=("$line"); done +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 - -The power of using an array becomes evident when you want to combine, for example, the command result with user-provided arguments: - - compile () { - args=( "$(pkg-config --libs openssl)" "${@}" ) - gcc "${args[@]}" client.c - } - compile -DDEBUG - + gcc -lssl -lcrypto -DDEBUG client.c \ No newline at end of file + gcc "${args[@]}" client.c \ No newline at end of file