El código de una función se almacena en la matriz asociativa functions
. Ese es el código fuente con espacios en blanco normalizados y sin comentarios (zsh ha realizado un análisis léxico y bastante -imprime los tokens ). Puede cambiar el código de una función modificando la entrada de la matriz functions
. Por ejemplo, para agregar código extra al principio:
functions[_cmake_define_common_property_names]="
… # your extra code here
$functions[_cmake_define_common_property_names]"
También puede usar la matriz functions
para copiar una función a otro nombre. Esta es la forma más fácil de envolver una función existente.
functions[_cmake_define_common_property_names_orig]=$functions[_cmake_define_common_property_names]
_cmake_define_common_property_names () {
…
_cmake_define_common_property_names_orig "$@"
}
La única forma segura -de cargar todas las funciones de un archivo creado para la carga automática es ejecutar la función, si puede hacer arreglos para ejecutarla sin efectos secundarios. Para una función de finalización, simplemente ejecute la función con los errores redirigidos al depósito de bits. No hará nada más que quejarse de que no se está ejecutando en un contexto de finalización.
_cmake 2>/dev/null
# Now _cmake_xxx is defined
La razón por la que autoload -Uz +X _cmake
no funciona es que las definiciones de las funciones auxiliares están en la propia función _cmake
.
% echo $functions[_cmake]
builtin autoload -XU
% autoload -Uz +X _cmake
% echo $functions[_cmake]
…
(( $+functions[_cmake_define_property_names] )) || _cmake_define_property_names () {
…
}
…
local cmake_command_actions
cmake_command_actions=('-E[CMake command mode]:*:command')
_cmake_command () {
_arguments -C -s - command "$cmake_command_actions[@]"
}
local cmake_suggest_build
cmake_suggest_build=('--build[build]')
if [ $CURRENT -eq 2 ]
then
_arguments -C -s - help "$cmake_help_actions[@]" - command "$cmake_command_actions[@]" - build_opts "$cmake_build_options[@]" - build_cmds "$cmake_suggest_build[@]" && return 0
elif [[ $words[2] = --help* ]]
then
_cmake_help
elif [[ $words[2] != -E ]]
then
_cmake_on_build
else
_cmake_command
fi
Si realmente no desea ejecutar la función de nivel superior, tiene varias opciones:
_cmake_define_common_property_names
dentro de la definición de _cmake
. _cmake_define_common_property_names
de la definición de _cmake
y utilícela para definir _cmake_define_common_property_names_orig
o _cmake_define_common_property_names
. Parchee la definición de _cmake
para eliminar las partes que no sean las definiciones de función, luego ejecútelo. Realmente no funciona con _cmake
, pero algunas otras funciones de finalización están mejor estructuradas. Por ejemplo, _cvs
consiste puramente en definiciones de funciones condicionales (, p. (( $+functions[_cvs_command] )) || _cvs_command () { … }
), una definición de la función titular y una llamada de la función titular como lo último, por lo que puede definir toda la función pero no ejecutar nada eliminando la última línea.
autoload -Uz +X _cvs
functions[_cvs]=${functions_cvs%'$\n'*}
_cvs
# Patch auxiliary functions here
Здесь строки, кажется, создают новую строку в конце:
Вы можете попробовать и увидеть разницу:
cat <<<"test"
cat <(printf '%s' "test")
Таким образом, вы должны использовать < <(printf '%s' "$line")
вместо <<<"$(printf '%s' "$line")"
.
Я бы написал:
while IFS= read -r line; do
for ((i=0; i<${#line}; i++)); do
char=${line:i:1}
((count++))
((low <= count && count <= high)) && char=$new_char
printf '%s' "$char"
done
echo
done <"$input"