如何以多行形式呈现命令以供即时复制/粘贴使用?

如何以多行形式呈现命令以供即时复制/粘贴使用?

我正在记录一些命令以供将来使用,其中一些命令太长,我想将它们记录在多行中以便可视化,然后只需复制并粘贴它们即可使用。例如:

生的:

openssl pkcs12 -export -in intermediate/certs/lala-lira.cert.pem -inkey intermediate/private/lala-lira.key.pem -out intermediate/private/lala-lira.pfx

演示:

openssl pkcs12 -export
-in intermediate/certs/lala-lira.cert.pem
-inkey intermediate/private/lala-lira.key.pem
-out intermediate/private/lala-lira.pfx

问题是,如果我复制并粘贴演示形式,每一行将被解释为一个单独且独立的命令。

答案1

除最后一行外,每一行都以反斜杠结束。以您的命令为例:

openssl pkcs12 -export \
-in intermediate/certs/lala-lira.cert.pem \
-inkey intermediate/private/lala-lira.key.pem \
-out intermediate/private/lala-lira.pfx

您在这里所做的是转义行尾,导致 shell 将其视为非分隔空格。由于转义标记仅对下一个字符有影响,因此下一个字符必须成为行尾。 (这意味着不允许有尾随空格;要小心!)

答案2

您可以创建一个函数(或 shell 脚本)来包装文本并分配反斜杠:

function wrapit { fmt -s -w 50 - | sed '$!s/$/ \\/'; }

这使用FMMT工具将文本换行为 50 个字符(根据需要进行调整)。它还告诉仅fmt( s) 分割,这样它就不会在输入中加入任何短行。然后它使用 sed 向除最后一行之外的每一行添加反斜杠:

  • $是文件最后一行的地址
  • !意味着在执行以下操作的行上应用后续命令不是匹配给定的地址(这里是除最后一行之外的所有地址)
  • s/$/ \\/表示用空格和反斜杠替换“行尾”( $),其中需要转义反斜杠才能最终显示为单个反斜杠。

将文本通过管道传输到此函数/脚本,或者执行脚本,然后输入文本,然后使用 Control-D 结束文本:

echo "openssl pkcs12 -export -in intermediate/certs/lala-lira.cert.pem -inkey intermediate/private/lala-lira.key.pem -out intermediate/private/lala-lira.pfx" | wrapit

或者

$ wrapit
openssl pkcs12 -export -in intermediate/certs/lala-lira.cert.pem -inkey intermediate/private/lala-lira.key.pem -out intermediate/private/lala-lira.pfx

Control-D

这是一个简单的脚本——它不理解命令选项或引号;它将把你的示例输入变成:

openssl pkcs12 -export -in \
intermediate/certs/lala-lira.cert.pem -inkey \
intermediate/private/lala-lira.key.pem -out \
intermediate/private/lala-lira.pfx

但如果您需要针对多种输入的脚本化解决方案,我想提供一个通用答案。

相关内容