如何执行来自grep结果的行?


10

我有一个带有某些安装说明的文本文件,并且我知道我可以grep表示文件中的唯一位置。例如,文本文件具有以下内容:

MYDIR =`找到/ home / user -name somedir`
出口PERL5LIB = $ PERL5LIB:$ MYDIR

在bash中,如何在文件中的grep之后执行行?就像是:

从“ grep somedir INSTALLFILE”执行结果
执行“ grep'export PERL5LIB'INSTALLFILE”的结果

2
以这种方式自动执行不是有点危险吗?
Faheem Mitha

2
@Faheem和@avilella:确实有点危险,的确很危险!另外,有些脆弱。
Caleb

Answers:


4

假设:

  • 您可以控制此文件,并且没有恶意代码的危险
  • 您想将这些变量设置为当前的shell

您可以将命令重定向到临时文件并执行:

tmp=$(mktemp)
{
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
} > "$tmp"
. "$tmp"

或者您可以评估结果

eval "$(grep somedir INSTALLFILE)"
eval "$(grep 'export PERL5LIB' INSTALLFILE)"

更新旧答案。我今天要做的是使用流程替代:

source <(
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
)

请注意,对于source <(...),您需要bash 4或更高版本。它不适用于旧版本(尽管zsh可以)。
斯特凡Chazelas

11

要在单独的shell进程中评估行:

grep somedir INSTALLFILE | sh

要评估正在运行的shell进程中的行:

eval "$(grep somedir INSTALLFILE)"

+1是唯一一个穿过树林可以看到森林的人。特此删除我的答案。@avilella:为方便起见,您可以在s的一个或另一个上使用-A 1-B 1作为标志,grep以使用一个grep提取这两行,并在任一@Gilles解决方案中使用它。
Caleb

请注意,在某些系统上,它sh可能是到另一个外壳的符号链接,而不是您期望的外壳,因此结果可能无法预测。为了安全起见,请具体说明您所期望的确切外壳,例如grep somedir INSTALLFILE | bash
thdoan '17

-2

您是否考虑过使用find的“ exec”功能,例如:

find somedir -name INSTALLFILE -exec {}\;

我认为OP希望执行返回grom grep的结果,而不是运行从find返回的每个结果。
Caleb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.