7 votos

Se puede deshabilitar la coincidencia sin distinción entre mayúsculas y minúsculas en los ejecutables de $PATH en Bash?

Hoy escribí Grep por error en mi Terminal y para mi sorpresa, el comando /bin/grep se ejecutó de todos modos. NO quiero este comportamiento. Pero, parece que no es posible deshabilitarlo. Actualmente estoy utilizando macOS 14.5.

Probé esto tanto con Bash 3.2.57 integrado como con Bash 5.2.26 de Homebrew, los resultados fueron los mismos.

$ Grep
uso: Grep [-abcdDEFGHhIiJLlMmnOopqRSsUVvwXxZz] [-A num] [-B num] [-C[num]]
    [-e patrón] [-f archivo] [--binary-files=value] [--color=when]
    [--context[=num]] [--directories=action] [--label] [--line-buffered]
    [--null] [patrón] [archivo ...]

$ echo $BASH
/bin/bash

$ echo $BASH_VERSION
3.2.57(1)-release

$ command -v grep
/usr/bin/grep

$ command -v Grep
/usr/bin/Grep

$ stat -f%i /usr/bin/grep  # outputs inode
1152921500312525090

$ stat -f%i /usr/bin/Grep
1152921500312525090        # mismo

Esperaba encontrar una directiva que pudiera poner en mi .bash_profile, un comando shopt por ejemplo. Pero estos son los únicos dos que pude encontrar, y experimenté con ambos sin éxito.

$ shopt | grep case
nocaseglob      off
nocasematch     off

4voto

Rich Puntos 2429

¡No, no puede!

Si lo compruebas con ls -ldi /usr/bin/grep /usr/bin/Grep verás que ambos existen en tu sistema de archivos pero son el mismo inode.

Este no es un problema típico de bash. Cualquier shell te mostrará la misma verdad. Esto es una "característica" del sistema de archivos¹. Este tipo de nomenclatura flotante de archivos puede crear un archivo llamado "A" y luego abrirlo como "a", creando así errores y vulnerabilidades.

La forma de deshacerte de este problema es:

  1. hacer una copia de seguridad completa del sistema de archivos root en un disco externo formateado como "sensible a mayúsculas y minúsculas". Una excelente herramienta para esta tarea es Carbon Copy Cloner (puedes lograr la misma copia perfecta con rsync pero con una larga lista de argumentos).
  2. Reinicia en esta copia de seguridad externa.
  3. Reformatea el sistema de archivos root original como uno "sensible a mayúsculas y minúsculas".
  4. Haz la copia simétrica desde tu disco externo hacia el original.

(Probado y aplicado en muchas versiones de macOS desde hace > 20 años).


¹) Como broma: los sistemas de archivos insensibles a mayúsculas y minúsculas fueron creados para personas que nunca aprendieron a usar un teclado en la escuela y no tuvieron la oportunidad de entrenar sus dedos para escribir correctamente. Desde hace más de ½ siglo, todos los sistemas operativos Unix operan en sistemas de archivos sensibles a mayúsculas y minúsculas.

0voto

Marc Wilson Puntos 146

kshu+m tiene la opción globcasedetect...

              globcasedetect
                      Cuando esta opción está activada, el globbing (ver Expansión de Rutas arriba) y la lista de nombres de archivo
                      y la finalización (ver Opciones de Edición en Línea arriba) se vuelven automáticamente insensibles a mayúsculas
                      y minúsculas en sistemas de archivos donde se ignora la diferencia entre mayúsculas y minúsculas
                      para los nombres de archivos. Esto se determina de forma transparente para cada directorio, por lo que un patrón de ruta
                      que abarque múltiples sistemas de archivos puede ser parte sensible a mayúsculas y parte insensible a mayúsculas.
                      En términos más precisos, cada patrón de componente de nombre de ruta separado por barras p se trata como
                      ~(i:p) si su directorio padre existe en un sistema de archivos insensible a mayúsculas y minúsculas. Esta opción está
                      presente solo en sistemas operativos que admiten sistemas de archivos insensibles a mayúsculas y minúsculas.

Eso no ayuda si solo escribes GREP, pero sí soluciona la autocompletación con pestañas.

0voto

David Anderson Puntos 2189

No conozco ninguna directiva. Sin embargo, la sensibilidad a mayúsculas y minúsculas se puede lograr colocando enlaces simbólicos en un volumen APFS sensible a mayúsculas y minúsculas. Este volumen APFS sensible a mayúsculas y minúsculas se agregaría al mismo contenedor APFS donde macOS está instalado en volúmenes APFS insensibles a mayúsculas y minúsculas. Estos enlaces simbólicos serían a los comandos encontrados en los directorios listados en la variable PATH. Me doy cuenta de que esto implica un gran número de enlaces simbólicos, pero estos se pueden crear rápidamente y fácilmente utilizando el script incluido en esta respuesta. Pude hacer esto para macOS Monterey y el tamaño resultante del volumen APFS sensible a mayúsculas y minúsculas fue inferior a 1 MB.

Esta respuesta demuestra una posible solución. Sin embargo, es probable que esta solución cause algún efecto secundario no previsto. Tales efectos secundarios pueden minimizarse cambiando solo el PATH para incluir /Volumes/CS cuando estás ingresando comandos manualmente.

A continuación se detallan los pasos necesarios para obtener comandos sensibles a mayúsculas y minúsculas.

  1. Utiliza la Utilidad de Discos para agregar un volumen APFS sensible a mayúsculas y minúsculas. Aquí usé el nombre CS.

  2. Crea el archivo de script llamado myscript. El contenido se muestra a continuación.

    #!/bin/zsh
    main() {
        local f "scptname=$1" "volname=${2:-CS}"
        shift
        cd /
        if [[ UID -ne 0 ]]; then
            # Sal si no eres el usuario root.
            echo "$scptname: No eres el usuario root. Intenta usando \"/usr/bin/sudo"\". >&2 
            return 1
        elif [[ ! -e "/Volumes/$volname" ]]; then
            # Sal si el volumen no existe.
            echo "$scptname: El volumen no existe: /Volumes/$volname" >&2 
            return 1
        fi
        # Elimina los directorios en la root del volumen
        # que están marcados como ocultos.
        /usr/bin/find "/Volumes/$volname" -maxdepth 1 -mindepth 1 -flags hidden -exec /bin/rm -rf "{}" \;
        # Recorre todos los caminos dados en la variable PATH.
        IFS=: read -A <<<"${PATH//\/Volumes\/$volname/}"
        for f in "${reply[@]}"; do
            IFS="/" read -A <<<"$f"
            if [[ -n ${reply[1]:-} || -z ${reply[2]:-} ]]; then
                # Salta un camino que no comienza con / o es la root.
                echo "$scptname: Saltando camino: $f" >&2
            else
                if [[ -e "/Volumes/$volname$f" ]]; then
                    # Salta si el camino ya ocurrió en PATH.
                    echo "$scptname: El directorio ya existe: /Volumes/$volname$f" >&2
                else
                    # Crea el directorio, marca oculto en la root del volumen y
                    # crea los enlaces simbólicos.
                    /bin/mkdir -p "/Volumes/$volname$f"
                    /usr/bin/chflags hidden "/Volumes/$volname/$reply[2]" >&2
                    /usr/bin/find "$f" -maxdepth 1 -mindepth 1 \( -type f -or -type l \) -exec /bin/ln -s "{}" "/Volumes/$volname{}" \;
                fi
            fi
        done
    }
    main "$(/usr/bin/basename "$0")" "$@"
  3. Ejecuta el script para crear los enlaces simbólicos en el volumen etiquetado como CS. Los directorios creados en la root del volumen CS están marcados como ocultos y por lo tanto no se mostrarán en una ventana de aplicación Finder.

    sudo ./myscript CS
  4. Agrega /Volumes/CS a la variable PATH. A continuación se muestra un ejemplo del contenido de una variable PATH.

    /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

    Después de agregar /Volumes/CS, esto cambiaría a lo siguiente.

    /Volumes/CS/usr/local/bin:/Volumes/CS/usr/bin:/Volumes/CS/bin:/Volumes/CS/usr/sbin:/Volumes/CS/sbin

    Nota: Es posible que necesites ingresar hash -r después de cambiar la variable PATH.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X