exec с переменным дескриптором файла

Прежде всего, я понятия не имею, что вы думаете о скобках, но нет никаких причин использовать (^|). Это означает "начало строки, или ничего". Я удивлен, что это допустимый синтаксис.

Аналогично, (:|$) кажется бессмысленным, когда все вхождения, о которых вы заботитесь, происходят в начале строки.

Если поместить переменную в двойные кавычки, она расширится. Если заключить ее в одинарные кавычки, она не будет расширяться.

Вам не нужен расширенный regex для всего этого.


Вместо:

grep -E '(^|)'${var}'(:|$)'

Используйте:

grep ^CAAJ: aaa.log

Или:

var=CAAJ
grep "^${var}:" aaa.log

Или, поскольку разделителем полей, о котором вы заботитесь, является :, просто используйте Awk:

awk -F: '$1 == "CAAJ"' aaa.log

Обратите внимание, что в этом последнем случае одинарные кавычки предназначены для оболочки, а двойные - для Awk. Все, что находится внутри одинарных кавычек, включая $1, будет передано Awk точно в таком же виде.

2
22.06.2017, 11:48
1 ответ

Ну, что касается того, почему это невозможно, вы бы не хотели:

echo "$x">file

Перестать работать, если $xокажется числом.

Вам необходимо сделать следующее:

eval 'exec '"$desc"'< "$file"'

Чтобы оболочка могла оценить код exec 5< "$file". evalподходит до тех пор, пока вы тщательно расширяете только то, что необходимо расширить (и что эти расширения безопасны) в его аргументах (здесь, используя крепкие кавычки для всего, кроме $ описание). Что было бы неправильно, так это что-то вродеeval "exec $desc< $file" , где содержимое $fileдается для оценки оболочкой как код оболочки.

С zshвы также можете использовать sysopen, встроенный в модуль zsh/system:

zmodload zsh/system
sysopen -u "$desc" -r -- "$file"

In: zsh, bashи ksh93

exec {desc}>&-

будут работать при закрытии fd, хранящегося в $desc, но в

exec {desc}> file

оболочка выделяет fd выше 10 и назначает на $desc. Его нельзя использовать для открытия файлана fd, который был заранее сохранен в $desc.

Обратите внимание, что exec >&"$desc"работает, потому что там нет двусмысленности... за исключением zshи последних версий bash, которые имеют >&оператор для перенаправления stdout и stderr в файл (как в csh), и где echo что-то >& "$file"работает только до тех пор, пока поскольку $fileне является числовым.

5
27.01.2020, 22:03

Теги

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