将脚本变量放入由 find 启动的子 shell 中

将脚本变量放入由 find 启动的子 shell 中

从此开始问题我在 Bash 脚本中使用了以下命令:

find ${svn_root} -maxdepth 2 -type d -exec bash -c 'if svnlook info "$1" &>/dev/null ;then echo"$1" >>${log_file} ;svnadmin verify "$1" 2>>{log_file} ;fi' _ {} \;

两个变量都在脚本的开头定义。变量 $svn_root 被适当扩展,但变量 $log_file 没有被适当扩展。

我看到变量没有传递到任何命令中-exec bash -c,我想这是因为它是一个子 shell?我可以log_file=/path/to/log ;在该行的前面插入echo,但是这种硬编码会将该部分命令变为硬编码,如果我在脚本中更改变量而不在 find 命令中更改它,我将输出到两个单独的日志文件!

我可以将该变量导入/导出到该子 shell 中吗 (如果是的话)?

答案1

主要有两种方式:

  1. 将其作为第二个参数传递给 shell

    find ... -exec bash -c '...' _ {} "$log_file" \;
    

然后"$2"${log_file}脚本中使用

  1. 通过环境传递它:

    log_file=$log_file find ... -exec bash -c '...' _ {} \;
    

顺便说一句,它不是一个子 shell。

答案2

bash -c ""如果您使用了双引号,那么您应该能够在子 shell 中看到此类变量。

一个更简单的方法是仅在主脚本中使用变量,如下所示exportlog_file

export log_file

来源:如何“发送”变量给子 shell?

答案3

使用

find ${svn_root} -maxdepth 2 -type d -exec bash -c 'if svnlook info "$0" &>/dev/null ;then echo"$0" >> "$1" ;svnadmin verify "$0" 2>> "$1" ;fi' {}  "$log_file" \;

您需要$0$1,因为这不是一个函数或脚本。

相关内容