是否可以回显文本并保留所有引号和双引号?我想写一个函数来复制当前写入终端的文本(完全带引号)。
让我们来探讨一下“当前写入终端”是什么意思。如果我理解正确,您希望在调用时向 shell 命令提供任意输入。换句话说,您有一些文本要添加到复制缓冲区中,并且您希望将其发送到pbcopy 的标准输入以执行此操作。
作为这个特定问题的解决方案,shell 函数不合适。这是因为需要使用受 shell 解释的参数调用 shell 函数,因此在调用 pb 和定义它时都必须小心地转义它们。这些字符串可以转义。但这很不方便,一方面是因为有几个特殊字符需要在双引号字符串中转义,但' 本身不能在单引号字符串中转义。
让我们探索一些其他选项。
$ pbcopy <<< "this is a simple one-line string directly from the command line. Since it's an argument to pbcopy it needs to be escaped."
$ pbpaste
this is a simple one-line string directly from the command line. Since it's an argument to pbcopy it needs to be escaped.
这里我们告诉shell 将文本提供给pbpaste 的标准输入。我们仍然需要对字符串进行转义。但我们不必将它传递到任何地方或再次正确引用它以使其成为有效的 shell 参数。
或者我们可以向pbcopy 提供多行字符串数据,而不必使用这种特殊的 here-doc 语法对其进行引用:
$ pbcopy <<-'-my-chosen-delimiter'
> Since this string's delimiter is single quoted,
> no interpolation will occur. That means " double quotes
> have no meaning, nor does ' single quotes, $dollar signs
> or other such meaningful bash syntaxes.
> -my-chosen-delimiter
$ pbpaste
Since this string's delimiter is single quoted,
no interpolation will occur. That means " double quotes
have no meaning, nor does ' single quotes, $dollar signs
or other such meaningful bash syntaxes.
我认为 bash 会比这更强大。
嗯,一方面,我认为这是一个很好的机会来比较和对比命令行参数(它们在设计上是固有的位置,因此必须解析和分割,通常是参数之间的空格)输入和输出用| 管道表示的流。 I/O 流旨在保存任意数据;您想将一个放入 shell 解析的变量列表不是 bash 的错。您在这里观察到的不是 bash 的强大功能,而是您的 bash 知识的功能限制。
但另一方面,你是对的。对用户交互式命令行界面的让步、实现向后兼容性的大量历史限制以及许多有效的设计考虑因素使bash 成为现实。我发现它及其同类是迄今为止最强大的计算机用户界面。但我不会用它来组装复杂的应用程序,因为坦率地说,它在语法上很困难。所以不要指望 bash 不是。如果你不想理解它的古怪和深奥的不规则性,坚持使用一些更新和更迂腐的东西,比如 python、go、ruby、node 或任何非以 unix 为中心的人现在运行的东西:P