Почему мой сценарий создает лишний символ?

Cómo parchear una función

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 functionspara 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 "$@"
}

Cargando todas las funciones

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 _cmakeno 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:

  • Parchear la definición de _cmake_define_common_property_namesdentro de la definición de _cmake.
  • Extraiga la definición de _cmake_define_common_property_namesde la definición de _cmakey utilícela para definir _cmake_define_common_property_names_origo _cmake_define_common_property_names.
  • Parchee la definición de _cmakepara 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, _cvsconsiste 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
    
2
11.07.2019, 17:07
2 ответа

Здесь строки, кажется, создают новую строку в конце:

Вы можете попробовать и увидеть разницу:

cat <<<"test"
cat <(printf '%s' "test")

Таким образом, вы должны использовать < <(printf '%s' "$line")вместо <<<"$(printf '%s' "$line")".

3
27.01.2020, 21:53

Я бы написал:

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"
3
27.01.2020, 21:53

Теги

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