从此开始问题我在 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
主要有两种方式:
将其作为第二个参数传递给 shell
find ... -exec bash -c '...' _ {} "$log_file" \;
然后"$2"
在${log_file}
脚本中使用
通过环境传递它:
log_file=$log_file find ... -exec bash -c '...' _ {} \;
顺便说一句,它不是一个子 shell。
答案2
bash -c ""
如果您使用了双引号,那么您应该能够在子 shell 中看到此类变量。
一个更简单的方法是仅在主脚本中使用变量,如下所示export
:log_file
export log_file
答案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
,因为这不是一个函数或脚本。