今週のBashパズル

今週のBashパズル

文字エンコーディングと bash 置換に関する非常に奇妙なパズルがあります。bash 変数を rake スクリプトに渡し、それが別の bash 変数にパイプされるのですが、次に何を試せばいいのかわかりません。これは、変数を置換以外の方法で作成した場合にのみ機能しますが、変数はどちらの方法で作成しても一致するだけでなく、バ​​イナリ表現も一致します。これはすべき不正なエンコーディング、ヌル終端文字、または表示できない文字に関連するものはすべて除外します。これは、私がこれまでに見たどの言語でも見た中で最も興味深いバグの 1 つなので、コミュニティと共有して、ここで何が起こっているのかについて誰かが何かアイデアを持っているかどうかを確認したいと思いました。詳細については、次のとおりです。

RELEASE_CODE=1250
MATCHING=replace
NAME=redactedDeployment-replace-d

まず、スクリプトが期待どおりの結果で成功する実際のケースです。

# 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

そして

# 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

関連情報