我很清楚源(aka。)实用程序,它将从文件中获取内容并在当前shell中执行它们。
现在,我将一些文本转换为shell命令,然后运行它们,如下所示:
$ ls | sed ... | sh
ls只是一个随机的例子,原始文本可以是任何东西。 sed也是,只是一个转换文本的例子。有趣的位是sh。我管任何我得到的嘘,它运行它。
我的问题是,这意味着启动一个新的子shell。我宁愿让命令在我当前的shell中运行。像我可以做的源一些文件,如果我有一个文本文件中的命令。
我不想创建一个临时文件,因为感觉脏。
或者,我想开始我的子shell与我当前的shell完全相同的特性。
更新
好的,使用backtick的解决方案肯定工作,但我经常需要这样做,而我检查和更改输出,所以我更喜欢如果有一种方法来管道的结果到最后的东西。
悲伤的更新
啊,/ 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和破折号(如果你更改源。)。显然这是bugs在bash 3.2。从bash 4.0 release notes:
Fixed a bug that caused `.’ to fail to read and execute commands from non-regular files such as devices or named pipes.