On Fri, Aug 13, 2010 at 07:43:21PM +0400, Alexey Tourbin wrote: > Есть ещё одна нехорошая засада - у нас /bin/sh и /bin/bash собраны > в очень разной конфигурации: у них отличается синтаксис. Я ставил > этот вопрос ещё 6 лет назад! > > $ sh -c 'diff <(echo a) <(echo b)' > sh: -c: line 0: syntax error near unexpected token `(' > sh: -c: line 0: `diff <(echo a) <(echo b)' > $ bash -c 'diff <(echo a) <(echo b)' > 1c1 > < a > --- > > b > $ Это не конфигурация, а документированная зависимость поведения bash от имени, использованного при вызове, и отключение поддержки process substitution в режиме совместимости с POSIX (документировано только в info bash, в man в явном виде не описано): $ bash --posix -c 'diff <(echo a) <(echo b)' bash: -c: line 0: syntax error near unexpected token `(' bash: -c: line 0: `diff <(echo a) <(echo b)' $ ln -s /bin/bash sh; ./sh -c 'diff <(echo a) <(echo b)' ./sh: -c: line 0: syntax error near unexpected token `(' ./sh: -c: line 0: `diff <(echo a) <(echo b)' $ sh -c 'set +o posix diff <(echo a) <(echo b)' 1c1 < a --- > b (в последнем случае нужно именно \n в строке, через разделитель ';' не сработает - видимо, переключение опции posix происходит только при разборе следующей строки).