我非常熟悉 source
(又名 .
)实用程序,它将从文件中获取内容并在当前 shell 中执行它们。
现在,我将一些文本转换为 shell 命令,然后运行它们,如下所示:
$ ls | sed ... | sh
ls
只是一个随机的例子,原文可以是任何东西。sed
也是,只是一个转换文本的例子。有趣的是 sh
。我把我得到的任何东西输送到 sh
,它就会运行它。
我的问题是,这意味着开始一个新的子 shell。我宁愿让命令在我当前的 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
所以,当我运行前者时,它会立即退出,什么也不会发生。