Передача аргументов для использования в процессе внука

Обратите внимание, сначала попробуйте позвонить по внешней линии / 10.

Ваш пример работает у меня

Asterisk 1.8.32.2

[call-file]
exten = _XXX,1,NoOp(it works)
exten = _XXX,n,Wait(100)
exten => s,1,Answer
exten => s,2,Wait(10)


Channel: Local/s@call-file/n
Context: call-file
Extension: 123
Priority: 1

Результат:

-- Executing [s@call-file:1] Answer("Local/s@call-file-00000000;2", "") in new stack
-- Executing [123@call-file:1] NoOp("Local/s@call-file-00000000;1", "it works") in new stack
-- Executing [123@call-file:2] Wait("Local/s@call-file-00000000;1", "100") in new stack
-- Remote UNIX connection
-- Executing [s@call-file:2] Wait("Local/s@call-file-00000000;2", "10") in new stack

Возможно, он не может позвонить по внешней линии или вам нужно обновить звездочку.

5
20.06.2018, 00:12
4 ответа

В скрипте не следует понижать уровень массива до строки. Переменная окружения и ее значение представляют собой простую пару key=value, где и key, и valueявляются строками. Понижение позиционных параметров до простой строки (путем конкатенации )затруднит сохранение разделения между ними, и будет трудно получить правильное цитирование, когда вы в конечном итоге захотите их использовать.

Вместо этого передайте позиционные параметры (аргумент командной строки ), которые вы хотите передать следующему сценарию в его командной строке.

#!/bin/bash

first_arg=$1
shift

# later...

./my_other_script "$@"

В другом сценарии:

#!/bin/bash

# use "$@" here
foo --bar "$@"
5
27.01.2020, 20:34

РЕДАКТИРОВАТЬ :Кажется, вы не можете экспортировать массивы в bash. Возможно, вам потребуется экспортировать функцию, которая настраивает массив, или что-то подобное.

Вы должны использовать массив, иначе аргументы с пробелами будут расширяться до нескольких слов.

export MY_ARGS=("$@")


foo --bar "${MY_ARGS[@]}"
2
27.01.2020, 20:34

Я не знаю, почему людей смущает этот вопрос, но, может быть, вопрос сбивает с толку, вот что мне кажется, работает нормально:

my_args_array=("$@")
export MY_ARGS="${my_args_array[@]}"

тогда мы просто используем MY_ARGSвот так:

foo --bar $MY_ARGS

примечание как указывает @Kusalananda :это будет ошибкой , если в исходных аргументах есть пробелы. И в этом случае лучше всего передавать аргументы через дочерние процессы, используя $@, вместо переменной env.

2
27.01.2020, 20:34

Общий ответ таков. Вы можете передать аргументы, используя:

  • позиционные параметры командной строки
  • переменные окружения
  • любой IPC (Inter -Process Communication ), доступный в вашей ОС

Чтобы сосредоточиться только на первых двух,

  • Наиболее естественным способом являются позиционные параметры. Это включает в себя возможное издание и дальнейшую передачу "$@", которая обозначает все определенные в настоящее время позиционные параметры. Это должно быть сделано на всех этапах иерархии процессов.
  • Переменные окружения не так прямолинейны -, как позиционные параметры, поскольку они представляют собой пару значений -и -. Даже если вы передаете значения таким образом, вам нужны ключи для их получения. Пока они не являются единственными переменными среды, которые я бы не принял без надлежащего рассмотрения. Но этот метод жизнеспособен. Все, что вам нужно сделать, это поделиться ключами между заинтересованными сторонами. Сами ключи могут быть основаны на шаблоне. Вот пример того, как это можно сделать.

    Есть два скрипта--p.bashи c.bash. pобозначает родительский объект, а c— дочерний. Они могут быть разделены посредниками, если они не удаляют значения, передаваемые через среду. Для простоты эти два скрипта имеют непосредственную связь в том, что p.bashвызывает c.bash.

    Вотp.bash:

    #!/bin/bash
    shift #consume the first argument
    #parse and export the other arguments
    prefix=abcdef_
    i=0
    for a in "$@"; do
        export "$prefix""$i"="$a"
        ((i++))
    done
    ./c.bash
    

    А вотc.bash:

    #!/bin/bash
    #consume the env arguments
    prefix=abcdef_
    env | grep ^"$prefix"
    

    А вот и казнь:

    $./p.bash arg "1 2" "3 4" "5 6"
    abcdef_0=1 2
    abcdef_1=3 4
    abcdef_2=5 6
    

    Я объясню две строки, по одной из каждого сценария.

    Первый — генератор,

     export "$prefix""$i"="$a"
    

    exportзаполняет окружение переменными вида abcdef_0, abcdef_1и т. д. Теперь дочерние процессы могут найти их в своем окружении. (При условии, что они не отключены каким-либо посредником.)

    env | grep ^"$prefix"в ребенке есть потребитель. envперечисляет переменные среды, а grepотфильтровывает все строки, не связанные с префиксом, отвечающим за рассматриваемую передачу. Как только вы поймете, что здесь происходит, вы сможете получить доступ к переданным переменным и использовать их внутри процесса-потомка.

2
27.01.2020, 20:34

Теги

Похожие вопросы