如何在当前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议我尝试一个进程替代源<(命令),它为我工作;