スキップしてメイン コンテンツに移動

bash のヒアドキュメントで $ を展開させない方法

シェルスクリプトのパッチを作成する場合、diff では何もしなくても$は展開されないので問題はないのですが、diffで作成されたパッチ文をヒアドキュメントでファイルに落とす場合、$が展開されるので、エスケープ処理しない限り、一々コピペするしかないと思い込んでいました。
ですが、ふと"ヒアドキュメント $ そのままで"と検索したところ、cat > test.patch <<'EOF'と EOF をシングルクォート(')で括れば良いとのことでした。
早速試した所、$が確かに展開されず、パッチフィルとして機能しました。
cat > scs_cert_generator.sh.patch <<'EOF'
--- scs_cert_generator.sh.orig	2024-07-10 22:03:58.000000000 +0900
+++ scs_cert_generator.sh	2025-05-23 16:26:34.516324152 +0900
@@ -628,8 +628,8 @@
 
     print_msg "Create self-signed Remote Connector certificate."
 
-    _GENERATED_CERTIFICATE=$(openssl x509 -req -in <(echo "$_GENERATED_CSR") -sha256 -extfile "$SCS_OPENSSL_CONFIG_FILE" \
-        -extensions v3_ca -signkey <(echo "$_PRIVATE_KEY") -out >(cat) -days ${SCS_OPENSSL_DAYS} 2>/dev/null)
+    _GENERATED_CERTIFICATE=$(openssl x509 -req -sha256 -days ${SCS_OPENSSL_DAYS} -in <(echo "$_GENERATED_CSR") \
+        -signkey <(echo "$_PRIVATE_KEY") -out >(cat) -extensions v3_req -extfile "$SCS_OPENSSL_CONFIG_FILE" 2>/dev/null)
 
     if [[ "$_GENERATED_CERTIFICATE" ]]
     then
EOF
patch < scs_cert_generator.sh.patch

# 確認
diff -urN scs_cert_generator.sh.orig scs_cert_generator.sh
--- scs_cert_generator.sh.orig	2024-07-10 09:03:58.000000000 -0400
+++ scs_cert_generator.sh	2025-06-14 03:29:30.899742794 -0400
@@ -628,8 +628,8 @@
 
     print_msg "Create self-signed Remote Connector certificate."
 
-    _GENERATED_CERTIFICATE=$(openssl x509 -req -in <(echo "$_GENERATED_CSR") -sha256 -extfile "$SCS_OPENSSL_CONFIG_FILE" \
-        -extensions v3_ca -signkey <(echo "$_PRIVATE_KEY") -out (cat) -days ${SCS_OPENSSL_DAYS} 2>/dev/null)
+    _GENERATED_CERTIFICATE=$(openssl x509 -req -sha256 -days ${SCS_OPENSSL_DAYS} -in <(echo "$_GENERATED_CSR") \
+        -signkey <(echo "$_PRIVATE_KEY") -out >(cat) -extensions v3_req -extfile "$SCS_OPENSSL_CONFIG_FILE" 2>/dev/null)
 
     if [[ "$_GENERATED_CERTIFICATE" ]]
     then
ちょっとしたことですが、これでシェルスクリプトの変更管理がかなり楽になりそうです。
今回は以上です。それでは。

コメント