将变量传递给子 shell

将变量传递给子 shell

人为的例子:

#!/usr/bin/bash
MYVAR=$(cat /somedir | grep -i myval)

现在我想要:

#!/usr/bin/bash
BASEDIR=/somedir
MYVAR=$(cat [BASEDIR?] | grep -i myval)

变量应该如何传递给子shell?

答案1

只是:

#!/bin/sh -
BASEDIR=/somedir
MYVAR=$(grep -rie myval -- "$BASEDIR")

子 shell 是父 shell 的副本,它们继承所有内存,包括变量和大多数其他内容。

cat请注意,在目录上运行没有什么意义。在这里,我们将变量的内容作为参数传递给grep并使用(非标准)-r选项,以便grep对通过该目录的递归下降找到的文件进行 grep。

连接cat单个文件也没有什么意义。

您不需要为此安装 bash,您的sh安装也同样好,而且可能更有效。

如果您想运行grep通过目录递归下降找到的所有常规文件的串联,您可以这样做:

MY_VAR=$(find -- "$BASEDIR" -type f -exec cat {} + | grep -i myval)

因此请注意,这些文件没有按特定顺序连接。使用 GNUgrep您还可以执行以下操作:

MYVAR=$(grep -rhie myval -- "$BASEDIR")

where-h跳过打印找到匹配行的文件的名称以实现类似的效果。顺序可能不同,如果某些文件的最后几行不带分隔符,您也可能会得到差异。

答案2

变量被复制到子 shell 中。如果你改变它们的值,改变的是不是传播回父级。

#!/bin/bash
set -eu
tmp=$(mktemp)

echo 123 > "$tmp"

value=$(cat "$tmp")
echo Found $value.

rm "$tmp"

相关内容