Чтобы использовать bash
функции, вы должны быть в bash
.Таким образом, в сценарии Perl, который помещает вас в кавычки или system
, где вы находитесь внутри bash
процесса † .Затем внутри этого процесса вы можете source
сценарий с функциями, которые будут их вводить, и выполнять их
funcs.sh
#!/bin/bash
function f1 {
t1=$1
u1=$2
echo "f1: t1=$t1 u1=$u1"
}
function f2 {
t2=$1
u2=$2
echo "f2: t2=$t2 u2=$u2"
}
ив Perl (однострочный)
perl -wE'
@r = qx(source funcs.sh; f1 a1 b1; f2 a2 b2);
print "got: $_" for @r
'
, где qx * 1019 * - оператор для обратных кавычек, но, возможно, более понятный.Я использую обратные пометки в случае, если вам нужно вернуться из этих функций.Если ваш /bin/sh
не связан с bash
† , тогда вызовите bash
явно
perl -wE'
@r = qx(/bin/bash -c "source funcs.sh; f1 a1 b1; f2 a2 b2");
print "got: $_" for @r
'
Присвоение массива помещает qx
в контекст списка, в котором онвозвращает STDOUT
того, что было запущено в виде списка строк.Это можно использовать для отделения возврата от разных функций, если они возвращают по одной строке каждая.a1,b1
и a2,b2
являются аргументами, передаваемыми f1
и f2
.
Prints
got: f1: t1=a1 u1=b1
got: f2: t2=a2 u2=b2
Это делает некоторые (разумные) предположения.
Если в возврате нет необходимости, но функции должны выполнять только свои функции, вы можете использовать
system('/bin/bash', '-c', 'source ... ')
, как в Ответ Хокон
† Это на самом деле /bin/sh
, но это часто сводится к bash
.Проверьте вашу систему (/bin/sh
, скорее всего, ссылка на другую оболочку).Или убедитесь, что bash
выполняет команду
my @ret = qx( /bin/bash -c "source base.sh; f1 a1 b1; f2 a2 b2" );
См. Текст для объяснения этого примера.