J'écris un extrait de code comme ci-dessous:
while IFS=$': \r\t' read -r -u9 marker v; do case $marker in Release) export RELEASE=$v ;; esac done 9< <(git show -s --format=%b)
Mais je vois que $ v
contient toujours \ r
. Depuis https://bash.cyberciti.biz/guide/ $ IFS, j'ai lu Une séquence de caractères d'espaces IFS est également traitée comme un délimiteur.
Ce que j'ai fait ne devrait-il pas supprimer le \ r
de fin des lignes?
3 Réponses :
Puisque vous formatez la sortie de git show
, utilisez un délimiteur null
% x00
dans votre chaîne de format git, cela ne peut jamais être capturé dans une variable shell:
while IFS=$': \t' read -r -u9 marker v do case $marker in Release) export RELEASE="$v" ;; esac done 9< <( git show -s --format='%b%x00' )
c'est une solution de contournement mais ne répond pas à la question
Vous pouvez modifier read
de cette façon:
read -r -u9 marker v possibly_something_else;
afin que $ v ne contienne pas \ r
J'ai utilisé tr
pour supprimer le \ r
de fin. C'était ma solution finale:
while IFS=$': \r\t' read -r -u9 marker v; do case $marker in Release) export RELEASE=$(echo $v | tr -d '\r\t') ;; esac done 9< <(git show -s --format=%b)
Si vous avez plus de 2 champs dans l'entrée, le deuxième et tous les champs suivants vont dans
$ v
, y compris les délimiteurs.Merci. Existe-t-il un moyen propre de réaliser ce que j'essaie de faire ici?
dirigez la commande
git
verstr -d '\ r'
à l'intérieur de la substitution de processus puis essayez votreIFS
sans le\ r code>
Êtes-vous sûr que cela fonctionne sous bash? Pour une raison quelconque, zsh ne semble pas couper les retours chariot dans cette situation.