如何创建一个 bash 命令来创建完全模仿源文本文件的输出,该输出可以粘贴到 histexpand 所在的 bash shell 中?

如何创建一个 bash 命令来创建完全模仿源文本文件的输出,该输出可以粘贴到 histexpand 所在的 bash shell 中?

目标是创建一个可以复制和粘贴的 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});'; 
...
 }

这可以用作目标系统上的一行补丁命令的输入,例如:

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

到目前为止一切顺利,直到源补丁文件包含 bang ( !) 字符。然后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

现在计算两个文件的补丁:

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

相关内容