gpt4 book ai didi

bash - 如何在当前 shell 中执行命令的输出?

转载 作者:行者123 更新时间:2023-11-29 08:39:31 25 4
gpt4 key购买 nike

我很了解 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

所以,当我运行前者时,它会立即退出,没有任何反应。

最佳答案

eval 命令就是为了这个目的而存在的。

eval "$( ls | sed... )"

更多来自 bash manual :

eval

          eval [arguments]

The arguments are concatenated together into a single command, which is then read and executed, and its exit status returned as the exit status of eval. If there are no arguments or only empty arguments, the return status is zero.

关于bash - 如何在当前 shell 中执行命令的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1279953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com