Процесс подстановки внутри подоболочки для установки переменной

Нет, но вы можете просто интерполировать шаблон в строку, заключенную в двойные кавычки, которую вы передаете в awk:

awk -v l="$line" "BEGIN {p=0}; /$pattern/ {p=1}; END{ if(p) print l >> \"outfile.txt\" }"

Обратите внимание, что теперь вам нужно избежать двойного -в кавычках awk буквально, но это все еще самый простой способ добиться этого.

4
24.02.2019, 01:29
1 ответ

Это ошибки, которые вы получаете при попытке выполнить замену процесса в bash, когда оболочка работает в режиме POSIX. Оболочка bashне поддерживает замену процессов в режиме POSIX.

bashбудет работать в режиме POSIX, когда либо

  1. set -o posixбыл использован или
  2. оболочка вызывается как sh.

Я подозреваю, что у вас есть скрипт, test.sh, который вы используете с sh test.shили который имеет строку #!/bin/shhashbang, и что ваш shоказался bash. Другая возможность заключается в том, что скрипт вообще не содержит строки#!-и вызываетсяbash-как-shкаким-то другим способом.

Вместо этого убедитесь, что ваш test.shскрипт вызывается bash.

Пример:

$ cat script.sh
echo hello
$ cat test.sh
var=$(bash <( cat script.sh ))
printf 'var="%s"\n' "$var"
$ bash -o posix test.sh
test.sh: command substitution: line 2: syntax error near unexpected token `('
test.sh: command substitution: line 2: `bash <( cat script.sh ))'
var=""
$ bash test.sh
var="hello"

Если вы хотите сделать это переносимым способом в своем test.shскрипте с использованием POSIXsh:

var=$( cat script.sh | bash )
printf 'var="%s"\n' "$var"

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

Если вам нужно оставить стандартный ввод оболочки bashв покое (, потому что вам нужно читать из него ), вы можете предположить, что mktempдоступен, и использовать

var=$( tmpfile=$(mktemp); cat script.sh >"$tmpfile" && bash "$tmpfile"; rm -f "$tmpfile" )
printf 'var="%s"\n' "$var"

Где cat script.shпонимается как более поздняя замена на вашу команду curl.

Если вам удобно жонглировать файловыми дескрипторами,вы также можете сделать файловый дескриптор 3 копией стандартного входного дескриптора перед вызовом оболочки bash, а затем позволить выбранному сценарию читать из этого:

var=$( exec 3<&0; cat script.sh | bash )
printf 'var="%s"\n' "$var"

Затем сценарий script.shбудет использовать read -u 3для чтения из исходного стандартного входного потока или utility <&3для перенаправления этого входного потока в другую утилиту.

13
27.01.2020, 20:47

Теги

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