RE: [PATCHv2] completion: make compatible with zsh
From: Peter Kjellerstedt <hidden>
Date: 2016-06-15 22:49:25
quoted hunk ↗ jump to hunk
-----Original Message----- From: git-owner@vger.kernel.org [mailto:git-owner@vger.kernel.org] On Behalf Of Mark Lodato Sent: den 31 augusti 2010 02:56 To: SZEDER Gábor Cc: Shawn O. Pearce; git@vger.kernel.org; avarab@gmail.com; Jonathan Nieder; Andrew Sayers Subject: Re: [PATCHv2] completion: make compatible with zsh 2010/8/30 SZEDER Gábor [off-list ref]quoted
On Thu, Aug 26, 2010 at 10:45:56PM -0400, Mark Lodato wrote:quoted
@@ -2417,3 +2433,29 @@ if [ Cygwin = "$(uname -o 2>/dev/null)" ]; thencomplete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \ || complete -o default -o nospace -F _git git.exe fi + +if [[ -z $ZSH_VERSION ]]; then-z? I think you wanted to use -n here, like at the other places.Oh, yes, sorry. This was a mistake. Thanks for catching it.quoted
Nit: why "if [[ ... ]]"? FWIW "if [ ... ]" would be enough.Because you don't need to quote variables with [[ ... ]] --- e.g. [ $lines = 0 ] fails, though in this case this feature does not matter--- and because [[ ... ]] is faster.Bash 4.1.5:quoted
time (for (( i = 0; i < 200000; i++ )); do [ -z $foo ]; done)real 0m3.430s user 0m3.240s sys 0m0.180squoted
time (for (( i = 0; i < 200000; i++ )); do [[ -z $foo ]]; done)real 0m2.219s user 0m2.090s sys 0m0.100s Zsh 4.3.10:quoted
time (for (( i = 0; i < 2000000; i++ )); do [ -z $foo ]; done)(; for ((i = 0; i < 2000000; i++ )) do; [ -z $foo ]; done; ) 13.56s user 1.64s system 99% cpu 15.327 totalquoted
time (for (( i = 0; i < 2000000; i++ )); do [[ -z $foo ]]; done)(; for ((i = 0; i < 2000000; i++ )) do; [[ -z $foo ]]; done; ) 4.62s user 0.01s system 99% cpu 4.644 total Is there a reason to prefer [ ... ] ?
The [ command is defined by POSIX, while [[ is an extension to the shell language implemented by bash (and zsh). Thus the [[ construct would fail on a stricter POSIX implementation of the shell language, e.g., as implemented by dash. Thus to be POSIX compliant (which is required for shell scripts installed by a multi system supporting application like git), the [[ construct cannot be used. Of course, this does not really apply to a script explicitly written for bash, but that is the common reason to prefer [ over [[ in shell scripts. //Peter