我非常清楚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
所以,当我运行前者时,它会立即退出,什么也不会发生。