Macos 如何将剪贴板上的文本行作为bash命令执行

Macos 如何将剪贴板上的文本行作为bash命令执行,macos,bash,unix,clipboard,Macos,Bash,Unix,Clipboard,我正在使用MacOSX的pbpaste命令,该命令返回剪贴板的内容。我想创建一个shell脚本,将pbpaste返回的每一行作为单独的bash命令执行。例如,假设剪贴板的内容由以下几行文本组成: echo 1234 >~/a.txt echo 5678 >~/b.txt 我想要一个shell脚本来执行每一行,在我的主文件夹中创建两个文件a.txt和b.txt。经过大量的搜索和反复尝试,我已经能够在中为变量分配单独的文本行,而循环使用以下结构: pbpaste | egrep -o

我正在使用MacOSX的
pbpaste
命令,该命令返回剪贴板的内容。我想创建一个shell脚本,将
pbpaste
返回的每一行作为单独的bash命令执行。例如,假设剪贴板的内容由以下几行文本组成:

echo 1234 >~/a.txt
echo 5678 >~/b.txt
我想要一个shell脚本来执行每一行,在我的主文件夹中创建两个文件a.txt和b.txt。经过大量的搜索和反复尝试,我已经能够在
中为变量分配单独的文本行,而
循环使用以下结构:

pbpaste | egrep -o [^$]+ | while read l; do echo $l; done
pbpaste | egrep -o [^$]+ | while read l; do $l; done
按预期将以下信息发送至标准输出:

echo 1234 >~/a.txt
echo 5678 >~/b.txt
我不再简单地回显每行文本,而是尝试使用以下结构执行它们:

pbpaste | egrep -o [^$]+ | while read l; do echo $l; done
pbpaste | egrep -o [^$]+ | while read l; do $l; done
我认为这将执行每一行(从而在我的主文件夹中创建两个文本文件a.txt和b.txt)。相反,第一个术语(
echo
)似乎被解释为命令,其余术语(
nnnn>~/…
)似乎被集中在一起,就像它们是一个参数一样,导致以下内容被发送到标准输出,而不创建任何文件:

1234 >~/a.txt
5678 >~/b.txt
如果有人能帮助我理解为什么我的构造不起作用,以及什么样的变化可能使它起作用,我将不胜感激

[…]其余的术语(
nnnn>~/…
)似乎被集中在一起,好像它们是一个单独的参数,[…]

不完全是。该行实际上是按空格分割的(或
$IFS
指定的任何内容),但问题是重定向运算符
不能从shell变量中获取。例如,此代码段:

gt='>'
echo $gt foo.txt
将打印
>foo.txt
,而不是将换行符打印到
foo.txt

对于其他各种shell元字符,例如引号,您也会遇到类似的问题

您需要的是
eval
builtin,它接受一个字符串,将其解析为shell命令,然后运行它:

pbpaste | egrep -o [^$]+ | while IFS= read -r LINE; do eval "$LINE"; done
(IFS=
-r
以及
$LINE
周围的双引号都是为了防止除
eval
执行的处理之外的任何其他处理,以便保留引号内的空白。)

另一种可能是,根据需要的详细信息,将命令通过管道传输到新的Bash实例中:

pbpaste | egrep -o [^$]+ | bash


编辑为添加:因此,我想到您可以在一个批次中将所有内容传递给
eval
;正如您可以(根据您的评论)编写
pbpaste | bash
,您也可以编写
eval“$(pbpaste)”
。这将支持多行
while
-循环等,同时仍在当前shell中运行(如果您希望它能够引用shell参数、设置环境变量等,则非常有用)。

+1了解
eval
的实际适当用法。另外,请注意,pipe to bash选项将允许多行结构(例如if和while语句的正常格式),但逐行选项将不允许。哇,ruakh,感谢您的精彩解释和解决方案!在你和Gordon的带领下,我一直在玩pipe to bash选项,发现我可以完全消除
egrep
while
。以下高效的构造甚至可以完美地处理相当复杂的多行代码(
while
循环、条件测试、变量增量等):
pbpaste | bash