出于某种原因,我无法将第二个参数传递给另一个文件上的函数,正好在这里:
$lsValidLocal | xargs -n 1 -I {} bash -c 'Push "{}" "**$inFolder**"
functions.sh 上的推送功能无法读取第二个参数 $ inFolder 。
我尝试了几种不同的方法,到目前为止唯一的工作方式是导出变量以使其可全局访问(虽然不是一个好的解决方案)
script.sh
#!/bin/bash
#other machine
export otherachine="IP_address_otherachine"
#folders
inFolder="$HOME/folderIn"
outFolder="$HOME/folderOut"
#loading functions.sh
. /home/ec2-user/functions.sh
export lsValidLocal="lsValid $inFolder"
echo $inFolder
#execution
$lsValidLocal | xargs -n 1 -I {} bash -c 'Push "{}" "$inFolder"'
functions.sh
function Push() {
local FILE=$1
local DEST=$2
scp $FILE $otherachine:$DEST &&
rm $FILE ${FILE}_0 &&
ssh $otherachine "touch ${FILE}_0"
}
function lsValid() { #from directory
local DIR=$1
ls $DIR/*_0 | sed 's/.\{2\}$//'
}
export -f Push
export -f Pull
export -f lsValid
答案 0 :(得分:1)
您编写的代码存在的问题是$inFolder
位于单引号('
)内,这会阻止它被展开。
$lsValidLocal | xargs -n 1 -I {} bash -c 'Push "{}" "**$inFolder**"'
这将作为三个独立的流程层执行
bash <your scrpit>
|
\xargs ...
|
\bash -c Push ...
您的代码没有将值从外壳传递到内壳......但是您正在使用内壳扩展变量inFolder
。正如您正确指出的那样,可以使用导出的环境变量来完成。
另一种方法是让外壳在传递给xargs之前展开它。
$lsValidLocal | xargs -n 1 -I {} bash -c "Push '{}' '**$inFolder**'"
请注意,我已撤消'
和"
,以便在调用$inFolder
之前展开xargs
。