ошибка «нет сопроцесса» при использовании чтения [дубликат]

Самый простой способ, который я могу придумать, это использование GNU grep:

$ grep -Po '<\K[^>]+(?=>)' file 
jdyefc@nsuwtcvc
ejd2ydt2@dv2dg2vgv
i2dmi32@hd2vdg 
2udhu2@cdrrc

Параметр -o означает "печатать только совпадающую часть строки", а -P активирует Perl-совместимые регулярные выражения. Это позволяет нам использовать \K, что означает "не считать частью совпадения все, что совпало до этого момента" и положительные lookaheads. Таким образом, регекс будет соответствовать , затем любому отрезку не > символов, за которым следует >.

Обратите внимание, что это также будет соответствовать , который не является электронным письмом. Чтобы ограничить только электронные письма (строки с @), вы можете использовать:

grep -Po '<\K[^>]+@[^>]+(?=>)' file 

5
11.09.2018, 05:55
1 ответ

Когда вы используете source, файл читает текущая оболочка, а не оболочка, упомянутая в строке #! . И я предполагаю, что ваша оболочка - это либо zsh, либо ksh93, которая использует read -p для чтения из сопроцесса.

Пример этого в ksh93:

cat /etc/passwd |&

while IFS=":" read -p user rest; do
    printf 'There is a user called %s\n' "$user"
done

Чтобы запустить ваш скрипт, либо явно укажите интерпретатор:

$ bash script.sh

... либо сделайте скрипт исполняемым и запустите его:

$ chmod +x script.sh
$ ./script.sh

Чтобы заставить read использовать пользовательскую подсказку в zsh и ksh93:

read username"?What's you name? " 
printf 'Hello %s!\n' "$username"
4
27.01.2020, 20:41

Теги

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