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
gitverstr -d '\ r'à l'intérieur de la substitution de processus puis essayez votreIFSsans 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.