histexpandと同じbashシェルに貼り付けることができるソーステキストファイルを正確に模倣する出力を生成するbashコマンドを生成するにはどうすればよいですか?

histexpandと同じbashシェルに貼り付けることができるソーステキストファイルを正確に模倣する出力を生成するbashコマンドを生成するにはどうすればよいですか?

目的は、コピーして貼り付けることができる(たとえば、Webフォーラムに投稿する)bash一行コマンドを作成し、ファイルをパッチすることです。パッチファイルをコピーしてコマンドラインに貼り付けて展開する方法を考えてください。

ソースシステムでは:

  1. パッチファイルが入力として使用されます。
  2. 出力を生成するには、別のbashコマンドを使用する必要があります。

現在、これは次のように行われます。

$ oldifs=$IFS;printf '\n{ ';while IFS= read -r p;do printf 'echo %q; ' "$p";done < custom.patch;printf ' }\n\n';IFS=$oldifs

これにより、次のような出力が生成されます。

{ 
...
echo \ //=\ require\ xyz.js; 
echo @@\ -81\,7\ +80\,6\ @@; 
echo $' \t\t\tchild.currentlyBackingUp = $(\'.dashboard-currently-backing-up\', element).dashboardBackup({type: this.type});'; 
...
 }

これは、ターゲットシステムで1行のパッチコマンドへの入力として使用できます。たとえば、次のようになります。

patch < { echo \ //=\ require\ xyz.js; echo @@\ -81\,7\ +80\,6\ @@; ... }

これまでは、ソースパッチファイルに前髪(!)​​文字が含まれるまで大丈夫でした。次に、printf次のようにエスケープされた出力を生成します。

echo $' \t\t\tif (!cp.user.isMyUserQueryLimited()) {'; 
echo $'-\t\t\t\tif (ui.tab.name === "map-tab" && !serverEnv.queryLimited) {'; 
echo $' \t\t\t\tif (!hosted) {';

このような行をbashコマンドラインに貼り付けると、次のような結果が得られます。

#-bash: !cp.user.isMyUserQueryLimited: event not found

プログラムでテキストストリームデータを生成する方法強く打つ履歴拡張が有効になっている(histexpand = on)他のbashコマンドプロンプトに貼り付けることができるコマンドを介してテキストデータストリームを出力するためにコピーして貼り付けることができるコマンドは何ですか?

ベストアンサー1

あなたの質問の詳細のいくつかは少し混乱しています。特に、なぜechoステートメントを生成したいのかわかりません。だから私は誤解しているかもしれませんが、コピー&ペーストコマンドでパッチを適用する方法を探しているようです。その場合は、次の方法を使用してこれを実行できます。ここのドキュメント

あなたの表記法を使用すると、次のように見えます。

patch <<HEREDOC
...
 //= require xyz.js
@@ -81,7 +80,6 @@
            child.currentlyBackingUp = $('.dashboard-currently-backing-up', element).dashboardBackup({type: this.type});
...
HEREDOC

以下は、技術を説明する簡単な例です。

まずファイルを作成します。

cat <<HEREDOC > file-v1.txt
this is the first line
HEREDOC

これで、ファイルの更新されたバージョンを作成します(行を追加するなど)。

cat <<HEREDOC > file-v2.txt
this is the first line
here is a second line
HEREDOC

次に、2つのファイルのパッチを計算します。

diff -u file-v1.txt file-v2.txt

出力は次のようになります。

--- file-v1.txt 2017-10-26 09:53:58.000000000 -0500
+++ file-v2.txt 2017-10-26 09:53:58.000000000 -0500
@@ -1 +1,2 @@
 this is the first line
+here is a second line

これで、コマンドは次のようになります。

patch file-v1.txt <<HEREDOC
--- file-v1.txt 2017-10-26 09:53:58.000000000 -0500
+++ file-v2.txt 2017-10-26 09:53:58.000000000 -0500
@@ -1 +1,2 @@
 this is the first line
+here is a second line
HEREDOC

このコマンドをコピーして端末に貼り付けて実行できる必要があります。正しいディレクトリにある場合は、埋め込みfile-v1.txtテキストで更新されます。file-v2.txt

また、heredocは履歴拡張を行いません。以下を確認できます。

cat <<HEREDOC
!!
HEREDOC

おすすめ記事