Wir haben ein sehr seltsames Rätsel im Zusammenhang mit Zeichenkodierungen und Bash-Ersetzungen, bei dem wir eine Bash-Variable an ein Rake-Skript übergeben, das in eine andere Bash-Variable weitergeleitet wird, und ich bin mir nicht sicher, was ich als nächstes versuchen soll. Es funktioniert nur, wenn Sie die Variable auf die nicht ersetzende Weise erstellen, aber die Variablen stimmen nicht nur überein, egal wie Sie sie erstellen, sondern sogar ihre binären Darstellungen stimmen überein. Diessollenalles ausschließen, was mit fehlerhaften Kodierungen, Nullterminatoren oder nicht darstellbaren Zeichen zu tun hat. Dies ist einer der interessantesten Fehler, die ich je bei der Arbeit mit einer Sprache gesehen habe, deshalb wollte ich ihn mit der Community teilen und sehen, ob jemand eine Idee hat, was hier los sein könnte. Weitere Informationen:
RELEASE_CODE=1250
MATCHING=replace
NAME=redactedDeployment-replace-d
Zunächst der Arbeitsfall, in dem das Skript mit dem erwarteten Ergebnis durchläuft.
# FULLNAME=redactedDeployment-1250-d
# deployments=$(rake find_deployments[$FULLNAME])
# echo $deployments
redactedDeployment-1250-d
# echo $FULLNAME
redactedDeployment-1250-d
# echo $FULLNAME | perl -lpe '$_=join " ", unpack"(B8)*"'
01110010 01100101 01100100 01100001 01100011 01110100 01100101 01100100 01000100 01100101 01110000 01101100 01101111 01111001 01101101 01100101 01101110 01110100 00101101 00110001 00110010 00110101 00110000 00101101 01100100
Und
# if [ "${MATCHING,,}" = "replace" ]; then
> FULLNAME=${NAME/replace/$RELEASE_CODE}
> tr -dc '[[:print:]]' <<< "$FULLNAME" #Remove non-printable characters, same result if we remove this line
> else
> FULLNAME=${NAME}-${RELEASE_CODE}
> fi
# deployments=$(rake find_deployments[$FULLNAME])
rake aborted!
Don't know how to build task 'find_deployments[redactedDeployment-1250-d' (See the list of available tasks with `rake --tasks`)
(See full trace by running task with --trace)
# echo $FULLNAME
redactedDeployment-1250-d
# echo $FULLNAME | perl -lpe '$_=join " ", unpack"(B8)*"'
01110010 01100101 01100100 01100001 01100011 01110100 01100101 01100100 01000100 01100101 01110000 01101100 01101111 01111001 01101101 01100101 01101110 01110100 00101101 00110001 00110010 00110101 00110000 00101101 01100100