Я использую bash -c
команду и функцию:
fun ()
{
echo "$0" ## it reads the parameter $i
}
for i in {1..5}
do
bash -c "fun" $i &
done
Мой вопрос: можно ли передать несколько параметров в функцию, используя bash -c
?, например:
fun ()
{
echo "$0" ## it reads the parameter $i
}
var="string" #variable
for i in {1..5}
do
bash -c "fun" $i $var &
done
решение1
Вы действительно запустили код? Оба фрагмента возвращают, fun: command not found
и это проблема, которую вам нужно решить в первую очередь.
Если только вам не удалось экспортировать fun
как функцию или определить еев другом местетаким образом, чтобы внутреннее bash
осознало команду (не буду вдаваться в подробности). Такая ситуация была бы совершенно вводящей в заблуждение, а потому неудачной в контексте дальнейших проблем.
Давайте начнем с простого кода, который делает то, что вы, вероятно, хотели:
#!/bin/bash
fun ()
{
echo "$1"
}
for i in {1..5}
do
fun "$i" &
done
Если вы получаете числа не в последовательности, это из-за &
. Я использовал &
здесь, потому что это было в вашем исходном коде.
Ваше определение функции синтаксически ОК. Мое определение использует $1
вместо $0
, мы доберемся до этого. Чтобы использовать функцию, вы просто вызываете ее имя, с аргументами или без них. В нашем случае:
fun
fun arg1
fun arg1 arg2
Внутри функции $1
, $2
, … расширяются до соответствующих аргументов. Вы используете $@
(или $*
если вы знаете, что делаете), чтобы получить все аргументы. Вы используете, $#
чтобы получить количество аргументов. Это очень похоже на ситуацию, когда fun
есть скрипт оболочки.
$0
внутри функции — это $0
основная оболочка. Она не имеет ничего общего с аргументами, переданными в функцию.
Вы можете запустить функцию в подоболочке:
( fun arg1 )
или в фоновом режиме (что неявно запускает его также в подоболочке):
fun arg1 &
Если fun
это функция в основной оболочке, то эти подоболочки также будут знать, что делать, когда команда fun
. С другой стороны, оболочка, запущенная с , bash -c
не имеет представления о fun
.
Еще раз: если вам не удалось export
… или…
В вашем случае bash -c
скорее препятствие. Я не вижу смысла в его использовании. Заставить его работать можно, но это будет громоздко. Тем не менее, вашявныйвопрос:
можно ли передать несколько параметров функции с помощью
bash -c
?
Мы можем. Ниже приведен громоздкий пример. Обратите внимание, что функция немного отличается (в образовательных целях). Я также отказался, &
потому что это только запутывает результаты.
#!/bin/bash
fun ()
{
echo "$2"
}
export -f fun
var="string"
for i in {1..5}
do
bash -c 'fun "$2" "$1"' inner-bash "$i" "$var"
done
Экспорт функции из Bash в Bash возможен, и мы только что это сделали. Экспорт функции из Bash в другую оболочку невозможен, если только оболочка не попытается быть совместимой и намеренно не интерпретирует некоторые переменные окружения как функции.
fun "$2" "$1"
заключены в одинарные кавычки, поэтому в основной оболочке "$2"
и "$1"
не раскрываются (будучи заключены в одинарные кавычки,они естьнетв двойных кавычках). В контексте внутреннего bash
эти $2
и $1
заключаются в двойные кавычки и расширяются до параметров, указанных после inner-bash
(здесь это произвольное имя).
Посмотрите, что происходит с числом, сохраненным как $i
:
- это
$i
в контексте основной оболочки; - затем это
$1
в контексте внутренней оболочки; - тогда это
$2
в контексте функции во внутренней оболочке.
Нет никаких преимуществ от использования bash -c
здесь, только неудобства. Не усложняйте свой код таким образом.
Еще кое-что:переменные в двойных кавычках.