2016-04-06 6 views
3

-a nicht liest, wenn ich ein:Warum in zsh

echo "1 the 
dquote> 2 quick 
dquote> 3 brown" | while read -a D; do echo "${D[1]}--${D[0]}"; done 

in bash heißt es:

the--1 
quick--2 
brown--3 

aber in zsh heißt es:

zsh: bad option: -a 

Warum? Und was soll ich stattdessen tun?

Antwort

5

In beiden Shells read ist ein Built-in. Es teilt den gleichen Zweck, aber die Implementierung und die Optionen unterscheiden sich.

Um in einem Array in zsh, zu lesen read erfordert die Option -A (statt -a):

echo "1 the 
2 quick 
3 brown" | while read -A D; do echo $D[2]--$D[1]; done 

Hinweis: Es gibt viele weitere Unterschiede zwischen zsh und bash:

  • In zsh Arrays sind von nummeriert eine standardmäßig, in bash beginnen sie von Null.
  • echo $ARRAY druckt gibt alle Elemente in zsh aber nur das erste Element in bash
  • Um das dritte Element eines Arrays in sh zu drucken Sie echo $ARRAY[3] verwenden können. In bash Klammern sind erforderlich, um den Index zu begrenzen, auch der Index für das dritte Element ist 2: echo ${ARRAY[2]}.
  • In zsh müssen Sie normalerweise keine Parametererweiterungen angeben, um Werte mit Leerstellen richtig zu behandeln.

    cat: 'no such file': No such file or directory 
    

    aber drei Fehlermeldungen in bash:

    cat: no: No such file or directory 
    cat: such: No such file or directory 
    cat: file: No such file or directory 
    
  • In zsh die builtin echo auswertet Escape-Codes standardmäßig beispielsweise

    FILENAME="no such file" 
    cat $FILENAME 
    

    wird nur eine Fehlermeldung in zsh drucken . In bash müssen Sie das Argument -e dafür übergeben.

    echo 'foo\tbar' 
    

    zsh:

    foo  bar 
    

    bash:

    foo\tbar 
    
  • ...

Im Allgemeinen ist es wichtig, im Auge zu behalten, dass, während zsh und bash sind ähnlich, sie sind weit davon entfernt, gleich zu sein.

+0

Hmm. Es scheint nicht zu verwenden -a für etwas anderes. Scheint wie eine merkwürdig sinnlose Inkompatibilität. –

+0

Keine Shell soll mit der anderen Shell kompatibel sein. Beide versuchen, mit POSIX konform zu sein, aber weder '-a' noch '-A' sind Optionen für die POSIX-Variante von 'read'. Ich würde annehmen, dass 'zsh'' -A' verwendet, um mit seiner 'set'-Built-In-Datei konsistent zu sein, die auch' -A 'verwendet, um ein Array zu setzen. BTW: Es ist umgekehrt; 'bash' (2.0 in 1996) folgte nicht' zsh's Beispiel (2.5 in 1994) mit '-A', was merkwürdig ist, da es' -A' für nichts anderes verwendet. ;) – Adaephon

+0

Ich denke, dass zsh versucht, mit bash kompatibel zu sein, wenn nichts dagegen spricht. Zsh mag zuerst gewesen sein, aber Bash ist Tausende Male populärer. Zsh verwendet nicht -a für irgendetwas anderes, also denke ich, dass es nur die pragmatische Sache tun sollte. 1996 war vor 20 Jahren. –