Прежде всего, я понятия не имею, что вы думаете о скобках, но нет никаких причин использовать (^|)
. Это означает "начало строки, или ничего". Я удивлен, что это допустимый синтаксис.
Аналогично, (:|$)
кажется бессмысленным, когда все вхождения, о которых вы заботитесь, происходят в начале строки.
Если поместить переменную в двойные кавычки, она расширится. Если заключить ее в одинарные кавычки, она не будет расширяться.
Вам не нужен расширенный regex для всего этого.
Вместо:
grep -E '(^|)'${var}'(:|$)'
Используйте:
grep ^CAAJ: aaa.log
Или:
var=CAAJ
grep "^${var}:" aaa.log
Или, поскольку разделителем полей, о котором вы заботитесь, является :
, просто используйте Awk:
awk -F: '$1 == "CAAJ"' aaa.log
Обратите внимание, что в этом последнем случае одинарные кавычки предназначены для оболочки, а двойные - для Awk. Все, что находится внутри одинарных кавычек, включая $1
, будет передано Awk точно в таком же виде.
Ну, что касается того, почему это невозможно, вы бы не хотели:
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
не является числовым.