From 70315713b7be989ab3fe1f0f44e72803c4aa6f5c Mon Sep 17 00:00:00 2001 From: koalaman Date: Sun, 9 Aug 2015 09:05:27 -0700 Subject: [PATCH] Updated SC2087 (markdown) --- SC2087.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/SC2087.md b/SC2087.md index c5abfb2..10e2a64 100644 --- a/SC2087.md +++ b/SC2087.md @@ -14,11 +14,23 @@ ### Rationale: -When the end token of a here document is not quoted, parameter expansions and command substitutions will be expanded. This means that the hostname printed will be that of the client, and not of the server. +When the end token of a here document is unquoted, parameter expansion and command substitution will happen on in contents of the here doc. -In other words, before sending the commands to the server, the client replaces `$HOSTNAME` with localhost, thereby sending `echo "Logged in on localhost"` to the server. +This means that before sending the commands to the server, the client replaces `$HOSTNAME` with localhost, thereby sending `echo "Logged in on localhost"` to the server. This has the effect of printing the client's hostname instead of the server's. -By quoting the here token, local expansion will not take place, so the server sees `echo "Logged in on $HOSTNAME"` which is expanded and printed with the server's hostname, which is usually the intention. +Scripts with any kind of variable use are especially problematic because all references will be expanded before the script run. For example, + + ssh host << EOF + x="$(uname -a)" + echo "$x" + EOF + +will never print anything, neither client nor server details, since before evaluation, it will be expanded to: + + x="Linux localhost ... x86_64 GNU/Linux" + echo "" + +By quoting the here token, local expansion will not take place, so the server sees `echo "Logged in on $HOSTNAME"` which is expanded and printed with the server's hostname, which is usually the intention. ### Exceptions: