Les autres réponses négligence deux pièges importants.
De fuite newline suppression
Commande d'extension supprime fin des retours à la ligne:
S="$(printf "a\n")"
printf "$S" | od -tx1
Sorties:
0000000 61
0000001
Cela rompt avec la méthode naïve de la lecture de fichiers:
FILE="$(mktemp)"
printf "a\n\n" > "$FILE"
S="$(<"$FILE")"
printf "$S" | od -tx1
rm "$FILE"
POSIX solution: ajouter un supplément de char à la commande de l'expansion et de l'enlever par la suite:
S="$(cat $FILE; printf a)"
S="${S%a}"
printf "$S" | od -tx1
Sorties:
0000000 61 0a 0a
0000003
Presque POSIX solution de contournement: ASCII de l'encodage. Voir ci-dessous.
NUL personnage de suppression
Il n'est pas sain d'esprit Bash moyen de stocker NUL personnages dans des variables.
Exemple:
printf "a\0b" | od -tx1
S="$(printf "a\0b")"
printf "$S" | od -tx1
Sorties:
0000000 61 00 62
0000003
0000000 61 62
0000002
Solutions:
ASCII de l'encodage. Voir ci-dessous.
-
utilisez bash extension $""
de littéraux:
S=$"a\0b"
printf "$S" | od -tx1
Ne fonctionne que pour les littéraux, donc pas utile pour la lecture de fichiers.
l'utilisation de Python. Probablement la meilleure option. =)
Solution de contournement pour les pièges
Magasin un uuencode, encodé en base64 version du fichier dans la variable, et de décoder avant chaque utilisation:
FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") | od -tx1
rm "$FILE"
Sortie:
0000000 61 00 0a
0000003
uuencode et udecode sont POSIX 7 , mais pas dans Ubuntu 12.04 par défaut (sharutils
package). Je ne vois pas POSIX 7 alternative pour le bash processus d' <()
de substitution de l'extension de l'exception de l'écriture à un autre fichier.
Bien sûr, c'est lent et peu pratique, donc je suppose que la vraie réponse est: ne pas utiliser Bash.