Левая часть pipe - подоболочка?

Изменить:

Мой комментарий ниже относительно sed @ ^ @ @ '<(f1) неверен Хотя $ BASH_SUBSHELL указывает, что мы находимся на том же уровне, что и запуск, переменные теряются в основном скрипте. на основе ответа Гордона я протестировал f1>> (sed ' s @ ^ @ @') , и это, похоже, работает правильно. Тем не менее, не следует ли BASH_SUBSHELL быть 1, а не 0 для первой формы?


Рассмотрим этот небольшой тест

#!/bin/bash
declare -i i=0
function f1()
{
  let i++
  echo "In f1, SUBSHELL: $BASH_SUBSHELL, i=$i" >&2
}

f1
f1 | sed 's@^@     @'

echo "at end, i=$i"

со следующим выводом:

In f1, SUBSHELL: 0, i=1
In f1, SUBSHELL: 1, i=2
at end, i=1

(цель sed - просто есть канал к чему-то, не ожидайте, что он что-то сделает, потому что f1 выводит на stderr)

Функция f1 регистрирует текущий BASH_SUBSHELL и текущее значение i

Я знаю, почему в конце сценария мы получаем i = 1 , потому что второй вызов был в подоболочке, а значение i в подоболочке 1 было потеряно.

Что я не делаю 's @ ^ @ @ '<(f1) Я хотел бы знать, почему левая сторона не находится на том же уровне, что и основной скрипт

11
задан nhed 1 March 2014 в 03:49
поделиться