Podrías intentar algo como:
declare -fx $(bash -c 'source /path/to/my-file &> /dev/null; compgen -A function')
Dado que desea exportar solo funciones del archivo, obtenerlo en una nueva instancia de bash y luego usar compgen -A function
enumerará los nombres de todas las funciones definidas en ese archivo (y las funciones exportadas previamente también, pero eso no debería ser un problema aquí ). Luego puede usar la salida de eso con export -f
o declare -fx
para exportar esas funciones.
Como está obteniendo el archivo en su bashrc, -volver a obtenerlo probablemente no será un problema.
Сksh93
:
VAR2=${VAR//+([^[:space:]])/\1.file1}
То же, что иzsh
:
set -o extendedglob
VAR2=${VAR//(#m)[^[:space:]]##/$MATCH.file1}
POSIXly:
VAR2=$(printf '%s\n' "$VAR" | sed 's/[^[:space:]]\{1,\}/&.file1/g')
(будьте осторожны, он удаляет завершающие символы новой строки, если они есть в$VAR
).
Все они заменяют последовательности из одного или нескольких (+(...)
, ##
,\{1,\}
)символов, отличных от пробелов ([^[:space:]]
), на одно и то же (\1
, $MATCH
,&
)и .file1
. добавлено.
Или вы можете разделить и объединить, если вы не заботитесь о сохранении количества пробелов между словами, а слова разделены SPC, TAB и NL (, а не другими пробелами )только:
unset IFS # default IFS of SPC+TAB+NL
set -o noglob # disable glob
set -- $VAR # split+glob without glob
for i do
set -- "$@" "$i.file1" # add suffix
shift
done
VAR2="$*" # join with space
В оболочках с поддержкой массивов вы можете использовать переменную массива вместо скалярной. С rc
/ es
/ zsh
/ ksh93
/ bash
/ mksh
/yash
:
VAR=(XYZ YZA ZAB)
Затем добавление .file1
к каждому элементу (, который на этот раз может содержать пробелы ), является просто вопросом:
VAR2=($VAR^.file1) # rc, es
VAR2=($^VAR.file1) # zsh
VAR2=("${VAR[@]/*/\0.file1}") # ksh93
VAR2=("${VAR[@]/%/.file1}") # bash
Простым решением будет использование возможности разделения оболочки (со значением по умолчаниюIFS
):
$ set -f; printf '%s.file1 ' $var; echo
XYZ.file1 YZA.file1 ZAB.file1
Имейте в виду, что при этом повторяющиеся пробелы/вкладки будут свернуты в один и удалены начальные и конечные пробелы -. set -f
позволит избежать проблем с именами файлов, которые содержат символы глобуса(* ? or [
). Печатная строка в этом случае будет иметь дополнительный пробел.
С zsh
здесь путь немного короче, чем у Стефана:
$ VAR="XYZ YZA ZAB"
$ VAR=( ${^=VAR}.file )
$ print -l $VAR
XYZ.file
YZA.file
ZAB.file
=
выполняет разбиение строки на слова, затем ^
"распределяет" суффикс для каждого слова.
http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion