我很了解source
(aka .
)实用程序,它将从文件中获取内容并在当前shell中执行它们。
现在,我将一些文本转换为shell命令,然后运行它们,如下所示:
$ ls | sed ... | sh
ls
只是一个随机的例子,原始文本可以是任何东西。sed
也只是一个转换文本的示例。有趣的是sh
。我用管道输送我所得到的一切sh
,然后运行它。
我的问题是,这意味着启动一个新的子外壳。我宁愿命令在我当前的shell中运行。就像我能够使用source some-file
,如果我在文本文件中包含命令。
我不想创建一个临时文件,因为感觉很脏。
另外,我想以与当前shell完全相同的特性启动子shell。
更新
好的,使用反引号的解决方案当然可以工作,但是我经常需要在检查和更改输出时执行此操作,因此我更希望是否有一种将结果最终传递给某些对象的方法。
悲伤的更新
嗯,这/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
因此,当我运行前者时,它将立即退出,没有任何反应。