Subject: Re: [PATCH 1/3] completion: fix alias listings with newlines

From: Johannes Sixt <[email-masked]>
Date: Wed, 07 Oct 2009 11:33:09 +0200

Stephen Boyd schrieb:
>  __git_aliases ()
>  {
> -	local i IFS=$'\n'
> -	for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
> -		i="${i#alias.}"
> -		echo "${i/ */}"
> +	local i
> +	git --git-dir="$(__gitdir)" config -z --get-regexp "alias\..*" 2>/dev/null |
> +	while IFS= read -rd '' i; do
> +		echo ${i#alias.} | cut -d' ' -f1
>  	done
>  }

Is it necessary to change the body of the loop? Your version spawns two
processes on each iteration, while the original spawned no processes.

You can avoid the pipeline (i.e. yet another process) using a "here-string":

	local i aliases=$(git --git-dir="$(__gitdir)" config -z \
				--get-regexp "alias\..*" 2>/dev/null)
	while IFS= read -rd '' i; do
		i="${i#alias.}"
		echo "${i/ */}"	# could be: echo "${i%% *}"
  	done <<< "$aliases"

but I don't know how well bash handles variable values with embedded NULs.

-- Hannes