Функция Bash - второй параметр в функции не принят
По какой-то причине я не могу передать второй параметр функции, которая находится в другом файле, именно здесь:
$lsValidLocal | xargs -n 1 -I {} bash -c 'Push "{}" "**$inFolder**"
Функция Push на 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
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
называется.