人为的例子:
#!/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"