git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] work around an obnoxious bash "safety feature" on OpenBSD

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 27, 2010, 00:29 UTC
Message-ID
<7veilcxudx.fsf@alter.siamese.dyndns.org>
Bash (4.0.24) on OpenBSD 4.6 refuses to run this snippet:
    $ cat gomi.sh
    #!/bin/sh
    one="/var/tmp/1 1"
    rm -f /var/tmp/1 "/var/tmp/1 1"
    echo hello >$one
    $ sh gomi.sh; ls /var/tmp/1*
    /var/tmp/1 1
    $ bash gomi.sh; ls /var/tmp/1*
    gomi.sh: line 4: $one: ambiguous redirect
    ls: /var/tmp/1*: No such file or directory

Every competent shell programmer knows that a <$word in redirection is not subject to field splitting (POSIX.1 "2.7 Redirection" explicitly lists the kind of expansion performed: "... the word that follows the redirection operator shall be subjected to ...", and "Field Splitting" is not among them).

Some clueless folks apparently decided that users need to be protected in the name of "security", however.

Output from "git grep -e '> *\$' -- '*.sh'" indicates that rebase-i suffers from this bogus "safety". Work it around by surrounding the variable reference with a dq pair.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 * I don't regularly run OpenBSD and build test on the platform only
   occasionally.  People who _do_ care about the platform perhaps need to
   run the testsuite to find and help fixing other possible issues.
   You will trigger this the path to your git work tree has whitespace
   in it, e.g. t3404.
 git-rebase--interactive.sh |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 19a608c..cecaa1d 100755
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -368,7 +368,8 @@ nth_string () {
 }
 
 update_squash_messages () {
-	if test -f "$SQUASH_MSG"; then
+	if test -f "$SQUASH_MSG"
+	then
 		mv "$SQUASH_MSG" "$SQUASH_MSG".bak || exit
 		COUNT=$(($(sed -n \
 			-e "1s/^# This is a combination of \(.*\) commits\./\1/p" \
@@ -378,7 +379,7 @@ update_squash_messages () {
 			sed -e 1d -e '2,/^./{
 				/^$/d
 			}' <"$SQUASH_MSG".bak
-		} >$SQUASH_MSG
+		} >"$SQUASH_MSG"
 	else
 		commit_message HEAD > "$FIXUP_MSG" || die "Cannot write $FIXUP_MSG"
 		COUNT=2
@@ -387,7 +388,7 @@ update_squash_messages () {
 			echo "# The first commit's message is:"
 			echo
 			cat "$FIXUP_MSG"
-		} >$SQUASH_MSG
+		} >"$SQUASH_MSG"
 	fi
 	case $1 in
 	squash)
@@ -403,7 +404,7 @@ update_squash_messages () {
 		echo
 		commit_message $2 | sed -e 's/^/#	/'
 		;;
-	esac >>$SQUASH_MSG
+	esac >>"$SQUASH_MSG"
 }
 
 peek_next_command () {



    
Next: Jeff Epler
Message 1 of 3 in “work around an obnoxious bash "safety feature" on OpenBSD”
  1. work around an obnoxious bash "safety feature" on OpenBSDJunio C Hamano, Jan 27, 2010
  2. Jeff EplerJan 27, 2010
  3. Junio C HamanoJan 27, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.