Quote this to prevent word splitting
46 # mkdir pytorch-build
47 cd /tmp/pytorch-build
48 # Build Torch
49 cmake -DBUILD_SHARED_LIBS:BOOL=ON -DCMAKE_BUILD_TYPE:STRING=Release -DPYTHON_EXECUTABLE:PATH=`which python3` -DCMAKE_INSTALL_PREFIX:PATH=../pytorch-install ../pytorch50
51 # Install Torch
52 cmake --build . --target install
Quote this to prevent word splitting
14# Setup docker repo.
15echo \
16 "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
17 "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \18 sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
19# Install docker.
20sudo apt-get update
Quote this to prevent word splitting
13sudo chmod a+r /etc/apt/keyrings/docker.gpg
14# Setup docker repo.
15echo \
16 "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \17 "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
18 sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
19# Install docker.
Description
When command expansions are unquoted, word splitting and globbing will occur. This can result unintended behaviour 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, it is recommended use a loop instead.
Problematic code:
ls -l $(getfilename)
Preferred 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
Exceptions:
In cases where you actually want word splitting, such as:
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