Можно ли передать несколько параметров в функцию bash с помощью bash -c?

Можно ли передать несколько параметров в функцию bash с помощью bash -c?

Я использую 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здесь, только неудобства. Не усложняйте свой код таким образом.

Еще кое-что:переменные в двойных кавычках.

Связанный контент