1 votes

La substitution de la commande zsh échoue lorsqu'elle est assignée à LINES

Pourquoi cela échoue-t-il pour zsh ?

bash-3.2$ FILENAME="/Users/john/Desktop/hash.txt"
bash-3.2$ LINES=$(cat $FILENAME)
bash-3.2$ echo $LINES
ccf09b34dd38f383ce0eb37efbda0bfc546bb562 b78ae347a7039aeb0643f7534300b7549c2cd9f4

en utilisant zsh...

11/17/21_2:17:39 /Users/john
$ FILENAME="/Users/john/Desktop/hash.txt"

11/17/21_2:17:47 /Users/john
$ LINES=$(cat $FILENAME)
zsh: bad math expression: operator expected at `b78ae347a7...'

11/17/21_2:24:07 /Users/john
$ LINES=$(`cat $FILENAME`) 
zsh: command not found: ccf09b34dd38f383ce0eb37efbda0bfc546bb562

11/17/21_2:26:34 /Users/john
$ LINES=`$(cat $FILENAME)` 
zsh: command not found: ccf09b34dd38f383ce0eb37efbda0bfc546bb562

11/17/21_2:26:40 /Users/john
$ LINES=`$(cat "$FILENAME")`
zsh: command not found: ccf09b34dd38f383ce0eb37efbda0bfc546bb562

11/17/21_2:28:30 /Users/john
$ LINES="$(`cat $FILENAME`)"
zsh: command not found: ccf09b34dd38f383ce0eb37efbda0bfc546bb562

abandonner et demander de l'aide

4voto

staffan Points 3299

Le problème réside dans le nom de la variable. LINES est l'une des variables ayant une signification conventionnelle. Sa signification est d'indiquer le nombre de lignes dans un terminal. Il existe une variable similaire COLUMNS .

L'une des tâches d'un shell interactif est de mettre à jour ces deux variables lorsque le terminal est redimensionné. C'est ce que font bash et zsh. Même dans bash, lorsque LINES=$(…) fonctionne, la valeur sera écrasée si vous redimensionnez le terminal.

Dans zsh, en plus, LINES y COLUMNS sont déclarées comme des variables entières (ce qui est parfaitement logique compte tenu de leur objectif). Ainsi, si vous essayez de les assigner, la chaîne que vous assignez est interprétée comme une expression arithmétique, d'où l'erreur si vous essayez d'assigner une chaîne qui n'est pas une expression arithmétique valide. Vous pouvez voir que la variable est déclarée comme un entier avec typeset :

% typeset -p LINES
typeset -i10 LINES=25

-i indique une variable entière, 10 l'oblige à être représenté en base 10 (qui est de toute façon la valeur par défaut).

N'utilisez pas de variables dont les noms sont utilisés par votre shell, telles que PATH , LINES , PS1 etc. Malheureusement, il n'existe pas d'espace de noms pour les variables de l'interpréteur de commandes ou de l'environnement : il faut partager. Le manuel de zsh donne la liste des variables que zsh définit et le variables que zsh utilise si l'utilisateur les définit . Le manuel de bash contient un liste des variables qu'il utilise ou définit .

Une convention très répandue veut que les variables d'environnement et les variables qui ont une signification pour l'interpréteur de commandes soient en majuscules. Mais zsh utilise également des variables en minuscules.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X