2011-08-01 1 views

答えて

33

シェルスクリプト内で他のスクリプトを埋め込むためにヒアドキュメント構文を使用します。

cat > file.tmp <<'endmsg' 
script goes here... 
endmsg 
+6

貼り付けられたスクリプトに引用符を含まないシェル変数が含まれている場合は、cat操作の前に現在のシェルによって評価されます。引用符を付けると、ペーストされたとおりにリテラルとしてエコーされます。 –

21

ヒアドキュメントのアプローチは素晴らしいですが、単純にそれを使用することはできません。

  • に問題があります。あなたのテキストエディタの自動クリーンアップ機能によってトリガーされる可能性のある、ペーストされたコンテンツのスペースやタブを保存しない
  • 使用するheredocマーカーの最後がペーストされたコンテンツ、操作はコンテンツが独自のheredocを持っていて、 'EOF'のような共通のマーカーを使用している場合、問題を早期に解決してください。

これは、ナイーブヒアドキュメントのアプローチがペーストされます正確な内容に応じて、成功するか失敗する可能性があります。少なくとも驚きの原則に違反し、セミランダムので、危険であることを意味しています。

私は最初にbase64 uuencodeでコンテンツをキャプチャする方が好きです。これにより、コンテンツによって異なる動作の可能性が排除されるため、これについて再度考える必要はありません。

より安全なアプローチ:

  1. キャプチャするコンテンツを識別し、whatever.sh
  2. uuencode -m whatever.sh whatever.sh >tmp
  3. ができないヒアドキュメントマーカーを使用してスクリプトラッパー
  4. にTMPの内容を貼り付け言いますベース64で発生

最後のスクリプトは次のようになります。

cat > file.tmp <<'_EOF' 
begin-base64 644 whatever.sh 
bHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMg 
LWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxS 
CmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxz 
IC1sUgpscyAtbFIK 
==== 
_EOF 
uudecode file.tmp 

uuencodeされたデータの行は、あなたのヘレドックマーカーに一致する可能性はごくわずかです。あなたはおそらく60文字の長さのマーカーを使用しないでしょう:)最後の行は短くてもかまいませんし、マーカが発生してはならない文字(アンダースコアなど)を使用していない限り、uuencodedコンテンツが誤ってマーカと一致する可能性がありますベース64エンコーディング_EOFは常に安全です。

'_EOF'のようなheredocマーカーを引用してブロック内のシェル変数拡張を防ぐことも賢明です。 $がbase64で使われていないので、base64でエンコードされたペイロードがシェル変数を間違って参照することはないと考えられますが、引用するとこの可能性は排除されます。また、シェル拡張を行う理由がない限り、常にheredocマーカーを引用する習慣を確立するのに役立ちます。これはコンテンツ依存の別の動作であり、明らかにランダムなので扱いにくいです。コンテンツブロック内でシェルを展開することがわからない限り、常にheredocマーカーを引用してください!

上記の手順は手動です。テンプレートを使用して同じことを自動化するのは簡単です。

2

sudoを使用する必要のあるファイルに出力したい場合は、その答えは全く分かりません。

sudo tee /etc/php/conf.d/xdebug.ini > /dev/null <<'TXT' 
zend_extension=xdebug.so 
xdebug.remote_enable=on 
xdebug.remote_autostart=on 
xdebug.remote_host=127.0.0.1 
xdebug.remote_port=9000 
xdebug.remote_handler=dbgp 
TXT 
関連する問題