zsh assignment failed within piped function

Или без использования зла, если:

server {
  server_name ~^(.*)\.example\.com$;
  return 301 $scheme://www.newdomain.example/categories/$1$request_uri;
}

поскольку $ request_uri уже содержит строку запроса / аргументы, см. http://nginx.org/en/docs/http/ngx_http_core_module.html

и Я также хочу упомянуть пару $ is_args $ args, если вы не хотите использовать $ request_uri

  location = /from {
    return 301 /to$is_args$args;
  }

3
27.03.2017, 02:10
2 ответа

Канал представляет подоболочку, в которой изменения переменных маскируются от родительского элемента; это похоже на циклы , а с конвейерами, где изменения переменных внутри этого цикла не влияют на родительский . Изменение PID можно наблюдать с помощью модуля zsh / system :

zmodload zsh/system

local testa=("a")
local testb=("b")

function test {
    testb=(${(P)1})
    echo "INSIDE testb=$testb $sysparams[pid]"
}

test "testa" | cat
echo "OUTSIDE testb=$testb $sysparams[pid]"

который должен отображать что-то вроде

% zsh foo.zsh
INSIDE testb=a 61488
OUTSIDE testb=b 61487
% 

другой подоболочки, разных переменных.

1
27.01.2020, 21:25

Две стороны оператора трубы идут параллельно. Для этого обе стороны запускаются в отдельных процессах. (Это был единственный способ сделать это в исходной оболочке Unix, и это все еще единственный способ сделать это в современных оболочках.) Рассмотрим фрагмент вроде

testb=left | testb=right
echo $testb

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

(Другие оболочки также могут запускать правую часть канала в подоболочке. Среди обычных оболочек только zsh и ATT ksh запускают правую часть в исходном контексте. Левая часть всегда выполняется в подоболочке.)

Если вы хотите передавать данные по конвейеру без создания подоболочки, вы можете использовать замену процесса . Подстановка процесса создает канал в подоболочке и дает контроль над тем, подключен ли исходный контекст к входной или выходной стороне канала.

test "testa" > >(cat)

(Обратите внимание на пробел между > и > (…) : >> (cat) будет анализироваться как подстановка процесса в режиме добавления, что передаст путь к каналу в качестве второго аргумента test . Здесь мы хотим перенаправить вывод вызова функции в канал.)

1
27.01.2020, 21:25

Теги

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