Обратите внимание, сначала попробуйте позвонить по внешней линии / 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
Возможно, он не может позвонить по внешней линии или вам нужно обновить звездочку.
В скрипте не следует понижать уровень массива до строки. Переменная окружения и ее значение представляют собой простую пару key=value
, где и key
, и value
являются строками. Понижение позиционных параметров до простой строки (путем конкатенации )затруднит сохранение разделения между ними, и будет трудно получить правильное цитирование, когда вы в конечном итоге захотите их использовать.
Вместо этого передайте позиционные параметры (аргумент командной строки ), которые вы хотите передать следующему сценарию в его командной строке.
#!/bin/bash
first_arg=$1
shift
# later...
./my_other_script "$@"
В другом сценарии:
#!/bin/bash
# use "$@" here
foo --bar "$@"
РЕДАКТИРОВАТЬ :Кажется, вы не можете экспортировать массивы в bash. Возможно, вам потребуется экспортировать функцию, которая настраивает массив, или что-то подобное.
Вы должны использовать массив, иначе аргументы с пробелами будут расширяться до нескольких слов.
export MY_ARGS=("$@")
foo --bar "${MY_ARGS[@]}"
Я не знаю, почему людей смущает этот вопрос, но, может быть, вопрос сбивает с толку, вот что мне кажется, работает нормально:
my_args_array=("$@")
export MY_ARGS="${my_args_array[@]}"
тогда мы просто используем MY_ARGS
вот так:
foo --bar $MY_ARGS
примечание как указывает @Kusalananda :это будет ошибкой , если в исходных аргументах есть пробелы. И в этом случае лучше всего передавать аргументы через дочерние процессы, используя $@
, вместо переменной env.
Общий ответ таков. Вы можете передать аргументы, используя:
Чтобы сосредоточиться только на первых двух,
"$@"
, которая обозначает все определенные в настоящее время позиционные параметры. Это должно быть сделано на всех этапах иерархии процессов. Переменные окружения не так прямолинейны -, как позиционные параметры, поскольку они представляют собой пару значений -и -. Даже если вы передаете значения таким образом, вам нужны ключи для их получения. Пока они не являются единственными переменными среды, которые я бы не принял без надлежащего рассмотрения. Но этот метод жизнеспособен. Все, что вам нужно сделать, это поделиться ключами между заинтересованными сторонами. Сами ключи могут быть основаны на шаблоне. Вот пример того, как это можно сделать.
Есть два скрипта--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
отфильтровывает все строки, не связанные с префиксом, отвечающим за рассматриваемую передачу. Как только вы поймете, что здесь происходит, вы сможете получить доступ к переданным переменным и использовать их внутри процесса-потомка.