如何在当前shell中执行命令的输出?

我很清楚source (aka . )实用程序,它将从文件中获取内容并在当前shell中执行它们。

现在,我正在将一些文本转换成shell命令,然后运行它们,如下所示:

 $ ls | sed ... | sh 

ls只是一个随机的例子,原文可以是任何东西。 sed也是,只是一个例子来转换文本。 有趣的是sh 。 我pipe任何我得到的东西,它运行它。

我的问题是,这意味着启动一个新的子shell。 我宁愿让命令在我的当前shell中运行。 就像我可以做的source some-file ,如果我有一个文本文件中的命令。

我不想创build一个临时文件,因为感觉脏。

另外,我想开始我的子shell与我目前的shell完全相同的特征。

更新

好的,使用反引号的解决scheme当然是有效的,但是当我检查和改变输出时,我经常需要这样做,所以我更喜欢是否有办法将结果转化为结果。

伤心的更新

嗯, /dev/stdin东西看起来非常漂亮,但是,在更复杂的情况下,它不起作用。

所以,我有这个:

 find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin 

这确保所有.doc文件的扩展名都是小写的。

而顺便说一句,可以用xargs来处理,但那不是重点。

 find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv 

所以,当我运行前者时,它会立即退出,没有任何反应。

 $ ls | sed ... | source /dev/stdin 

更新:这工作在bash 4.0,以及tcsh和破折号(如果你改变source . )。 显然这是在bash 3.2中的越野车。 从bash 4.0发行说明 :

修正了导致`。'的错误。 无法读取和执行非常规文件(如设备或命名pipe道)的命令。

eval命令是为了这个目的而存在的。

 eval "$( ls | sed... )" 

更多来自bash手册 :

EVAL

  eval [arguments] 

参数被连接在一起成为一个单一的命令,然后被读取和执行,其退出状态作为eval的退出状态返回。 如果没有参数或只有空的参数,返回状态是零。

哇,我知道这是一个古老的问题,但最近我发现自己也遇到了同样的问题(我就是这么来的)。

无论如何 – 我不喜欢source /dev/stdin答案,但我想我find了一个更好的答案。 实际上这看起来很简单:

 echo ls -la | xargs xargs 

很好,对吧? 实际上,这仍然不能达到你想要的,因为如果你有多条线路,它们将把它们连接成一个命令,而不是分别运行每个命令。 所以我find的解决scheme是:

 ls | ... | xargs -L 1 xargs 

-L 1选项意味着每个命令执行使用(最多)1行。 注意:如果你的行以尾部空格结束,它将与下一行连接在一起! 所以确保每一行以非空格结束。

最后,你可以做

 ls | ... | xargs -L 1 xargs -t 

看看执行了什么命令(-t是详细的)。

希望有人读这个!

尝试使用进程replace ,它用一个临时文件取代一个命令的输出,然后可以find它:

 source <(echo id) 

我相信这是对这个问题的“正确答案”:

 ls | sed ... | while read line; do $line; done 

也就是说,人们可以把它们变成一个while循环。 read命令命令从它的stdin取出一行,并将其分配给variables$line$line然后成为循环内执行的命令; 并继续,直到input中没有其他行。

这仍然不能用于一些控制结构(如另一个循环),但在这种情况下它适合于法案。

 `ls | sed ...` 

我有点像ls | sed ... | source - ls | sed ... | source - ls | sed ... | source -会更漂亮,但不幸的是source不明白-意思是stdin

我认为你的解决scheme是反引号的命令replace: http : //tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html

参见3.4.5节

那么为什么不使用source呢?

 $ ls | sed ... > out.sh ; source out.sh 

source / dev / stdin在我需要分配variables的时候并不适用于我。 freenode bash上的geirha指向我http://mywiki.wooledge.org/BashFAQ/024,并build议我尝试一个进程替代源<(命令),它为我工作;