Функция 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 называется.

Другие вопросы по тегам