Подоболочка и замена процесса

Ниже сработало для меня

sed "s|\(^.*\"image\": \"docker.abc.com/abc-pr0000abc:\).*|\ ABCCoreUI-47\",|g" -i Artifactorytest.json

0
09.05.2017, 23:16
1 ответ

Подстановка процессов — это функция, появившаяся в оболочке Korn в 80-х (в ksh86). В то время он был доступен только в системах, поддерживающих файлы /dev/fd/.

Позднее эта функция была добавлена ​​в zsh (с самого начала: 1990 г.) и bash (в 1993 г.).zsh использовал временные именованные каналы для его реализации, в то время как bash использовал /dev/fd/, где это было возможно, и именованные каналы в противном случае. zsh переключился на использование /dev/fd/, где это было доступно в 2.6-beta17 в 1996 году.

Поддержка замены процессов через именованные каналы на системы без /dev/fd были добавлены в ksh только в ksh93u+ в 2012 году. Общедоступный клон ksh не поддерживает Это.

Насколько мне известно, никакая другая борнеподобная оболочка не поддерживает его (rc, es, fish, не борнеподобные оболочки поддерживают его, но с другой синтаксис). yash имеет конструкцию <(...), но она предназначена для перенаправления процесса.

Несмотря на то, что эта функция весьма полезна, она никогда не была стандартизирована POSIX. Таким образом, нельзя ожидать найти его в sh, поэтому не следует использовать его в скрипте sh.

Хотя поведение для <(...) не указано в POSIX (поэтому его сохранение не повредит), bash отключает функцию при вызове как sh или при вызове с POSIXLY_CORRECT=1 в его среде.

Итак, если у вас есть скрипт, использующий <(...), вы должны использовать оболочку, которая поддерживает эту функцию, чтобы интерпретировать ее как zsh, bash или AT&T ksh (конечно, вам нужно сделать убедитесь, что остальная часть синтаксиса скрипта также совместима с этой оболочкой).

В любом случае:

cat <(cmd)

Можно написать:

cmd | cat

Или просто

cmd

Для команды, отличной от cat (для которой необходимо передать данные через файл, указанный в качестве аргумента), на системы с /dev/fd/x, вы всегда можете сделать:

something | that-cmd /dev/stdin

Или, если вам нужно сохранить стандартный ввод that-cmd:

{ something 3<&- | that-cmd /dev/fd/4 4<&0 <&3 3<&-; } 3<&0 
5
28.01.2020, 02:16

Теги

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