2017-11-12 21 views
0

私はMacで作曲者のPHP/Composerプロジェクトを簡単にセットアップできるように、.bash_profileにいくつかのエイリアスを追加しています。これを完了するが、私は問題を抱えている。私は作成しているファイルに文字列を出力しようとしていますが、一重引用符は削除され続けます。次のようにMacの端末でechoステートメントのエスケープ値

私は設定していたエイリアスは次のとおりです。

alias sp='touch index.php; echo "<?php \n\n require_once __DIR__ . $ '/vendor/autoload.php' ?>;" >> index.php; open/Applications/TextWrangler.app index.php;' 

私はPHPファイルに取得しています出力は、次のとおりです。

<?php \n\n require_once __DIR__ . $ /vendor/autoload.php \n\n ?> 

私は\ Eを使用して脱出しようとしたと$ 'string'

しかし運がありませんでした。

答えて

3

短い答え:何もしていないときは、別名の代わりに関数を使用し、ではなくechoの代わりに関数を使用してください。

長い答え:すぐに問題は、引用符がネストしないことです。一重引用符を含むエイリアスの周囲に一重引用符を使用しようとしていますが、それは動作しません。シェルは、一重引用符で囲まれたセグメント'touch index.php; echo "<?php \n\n require_once __DIR__ . $ 'を含むものとしてシェルを解析しており、続けて引用符で囲まれていないセグメント/vendor/autoload.phpが続き、一重引用符のセグメント' ?>;" >> index.php; open/Applications/TextWrangler.app index.php;'が続き、引用符が削除され、それらをまとめてエイリアスとして割り当てます。

これを修正する方法はありますが、醜いです。 alias sp='touch ... $ '"'"'/vendor/...のようなもの - ここでは、最初の一重引用符が一重引用符で囲まれたセグメントを終了し、次に一重引用符を含む二重引用符セグメントがあり、次に一重引用符セグメントの先頭になります。ブリー。

本当に、エイリアスを定義すると複雑になりますが、関数に切り替える方がよいでしょう。彼らは引用符で囲む必要はありませんので、この全体の問題は議論の余地がある。とりわけ:

sp() { 
    touch index.php 
    echo "<?php \n\n require_once __DIR__ . $ '/vendor/autoload.php' ?>;" >> index.php 
    open/Applications/TextWrangler.app index.php 
} 

しかし限り、私は提案を作ってるんだと、私は他の変更のカップルを作ると思います。まず、touchコマンドは、リダイレクトが何もしないことを何もしていないので、私はそれを残しておきます。第二に、\nechoを使用することは予測できません。 echoのいくつかのバージョンはそれを改行に変換しますが、そうでないものもあります。これはOS Xの異なるバージョン間で実際に変更されています。printfを使用する方がはるかに優れていますが、正しく使用するのはさらに複雑です。 printfの最初の引数は、残りの引数の表示方法を制御するための書式文字列です。 echoとのもう1つの大きな違いは、最後に改行が自動的に追加されるわけではないということです。私はあなたがindex.phpファイルにこれを配置すると仮定しています:

<?php 

require_once __DIR__ . $ '/vendor/autoload.php' 

?> 

printfでこれを行うには、いくつかの方法があります。

printf '%s\n' "<?php" "" "require_once __DIR__ . \$ '/vendor/autoload.php'" "" "?>" 

をしかし、この場合、私はここで、文書でcatを使用したい:おそらく最も簡単なのは、各ラインの引数行い、各1の後に改行を入れてフォーマット文字列を使用することです。あなたはクリーナーインデントをしたい場合は、あなたも<<-"EOF"を使用することができます

sp() { 
    cat <<"EOF" >>index.html 
<?php 

require_once __DIR__ . $ '/vendor/autoload.php' 

?> 
EOF 
    open/Applications/TextWrangler.app index.php 
} 

、その後、タブとヒアドキュメントのコンテンツ(ないスペース)をインデント:あなたは(別名とは異なり)関数の中でそれを行うことができます。

+0

偉大な答え!すべての情報を非常に感謝します。 –

関連する問題