7 votes

Est-ce que la correspondance insensible à la casse de Bash pour les exécutables dans $PATH peut être désactivée?

Aujourd'hui, j'ai tapé par erreur Grep dans mon Terminal et, à ma surprise, la commande /bin/grep s'est exécutée quand même. Je ne veux PAS ce comportement. Cependant, il semble impossible de le désactiver. Je suis actuellement sur macOS 14.5.

J'ai testé cela avec le Bash intégré 3.2.57 ainsi que le Bash 5.2.26 de Homebrew, les résultats étaient les mêmes.

$ Grep
usage: Grep [-abcdDEFGHhIiJLlMmnOopqRSsUVvwXxZz] [-A num] [-B num] [-C[num]]
    [-e pattern] [-f file] [--binary-files=value] [--color=when]
    [--context[=num]] [--directories=action] [--label] [--line-buffered]
    [--null] [pattern] [file ...]

$ 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        # même

J'espérais trouver une directive que je pourrais mettre dans mon .bash_profile, une commande shopt par exemple. Mais ce sont les seules deux que j'ai pu trouver, et j'ai expérimenté avec les deux sans succès.

$ shopt | grep case
nocaseglob      off
nocasematch     off

4voto

Rich Points 2429

Non, cela ne peut pas!

Si vous le vérifiez avec ls -ldi /usr/bin/grep /usr/bin/Grep, vous verrez qu'ils existent tous les deux sur votre système de fichiers mais ils ont le même inode.

Ce n'est pas un problème typique de bash. N'importe quel shell vous montrera la même vérité. Il s'agit d'une "caractéristique" du système de fichiers¹. Ce genre de nommage flottant des fichiers peut créer un fichier nommé "A" et plus tard l'ouvrir comme "a", créant ainsi des bugs et des vulnérabilités.

La solution à ce problème est la suivante:

  1. faire une copie de sauvegarde complète du système de fichiers racine sur un disque externe formaté en "sensible à la casse". Un excellent outil pour cette tâche est Carbon Copy Cloner (vous pouvez obtenir la même copie parfaite avec rsync mais avec une longue liste d'arguments).
  2. Redémarrer sur cette sauvegarde externe.
  3. Reformater le système de fichiers racine d'origine en "sensible à la casse".
  4. Faire la copie symétrique de votre disque externe vers l'original.

(Testé et appliqué sur de nombreuses versions de macOS depuis > 20 ans).


¹) En plaisantant : les systèmes de fichiers insensibles à la casse ont été créés pour les personnes qui n'ont jamais appris à utiliser un clavier à l'école et n'ont pas eu l'opportunité d'entraîner leurs doigts à taper correctement. Depuis plus de ½ siècle, tous les OS Unix fonctionnent sur des systèmes de fichiers sensibles à la casse.

0voto

Marc Wilson Points 3640

kshu+m a l'option globcasedetect...

              globcasedetect
                      Lorsque cette option est activée, le globbing (voir l'expansion des chemins ci-dessus) et la liste des noms de fichiers
                      et la complétion (voir les options d'édition en ligne ci-dessus) deviennent automatiquement insensibles à la casse
                      sur les systèmes de fichiers où la différence entre majuscules et minuscules est ignorée
                      pour les noms de fichiers. Cela est déterminé de manière transparente pour chaque répertoire, de sorte qu'un motif de chemin
                      qui traverse plusieurs systèmes de fichiers peut être en partie sensible à la casse et en partie insensible à la casse.
                      En termes plus précis, chaque motif de composant de nom de chemin séparé par des slashes p est traité comme
                      ~(i:p) si son répertoire parent existe sur un système de fichiers insensible à la casse. Cette option est
                      présente uniquement sur les systèmes d'exploitation qui prennent en charge les systèmes de fichiers insensibles à la casse.

Cela ne résout pas simplement en tapant GREP, mais cela corrige la complétion par tabulation.

0voto

David Anderson Points 30783

Je ne connais aucune directive. Cependant, la sensibilité à la casse peut être obtenue en plaçant des liens symboliques dans un volume APFS sensible à la casse. Ce volume APFS sensible à la casse serait ajouté au même conteneur APFS où macOS est installé sur des volumes APFS insensibles à la casse. Ces liens symboliques pointeraient vers les commandes trouvées dans les répertoires répertoriés dans la variable PATH. Je réalise que cela implique un grand nombre de liens symboliques, mais ceux-ci peuvent être créés rapidement et facilement en utilisant le script inclus dans cette réponse. J'ai pu le faire pour macOS Monterey et la taille du volume APFS sensible à la casse résultant était inférieure à 1 Mo.

Cette réponse montre une solution possible, Cependant, très probablement cette solution causerait des effets secondaires imprévus. Ces effets secondaires pourraient être minimisés en ne changeant que le PATH pour inclure /Volumes/CS lorsque vous saisissez manuellement des commandes.

Voici les étapes nécessaires pour obtenir des commandes sensibles à la casse.

  1. Utiliser l'Utilitaire de disque pour ajouter un volume APFS sensible à la casse. Ici, j'ai utilisé le nom CS.

  2. Créer le fichier de script nommé myscript. Le contenu est donné ci-dessous.

    #!/bin/zsh
    main() {
        local f "scptname=$1" "volname=${2:-CS}"
        shift
        cd /
        if [[ UID -ne 0 ]]; then
            # Quitter si vous n'êtes pas l'utilisateur root.
            echo "$scptname: Pas utilisateur root. Essayez d'utiliser \"/usr/bin/sudo"\". >&2 
            return 1
        elif [[ ! -e "/Volumes/$volname" ]]; then
            # Quitter si le volume n'existe pas.
            echo "$scptname: Le volume n'existe pas : /Volumes/$volname" >&2 
            return 1
        fi
        # Supprimer les répertoires à la racine du volume
        # qui sont marqués comme cachés.
        /usr/bin/find "/Volumes/$volname" -maxdepth 1 -mindepth 1 -flags hidden -exec /bin/rm -rf "{}" \;
        # Parcourir tous les chemins donnés dans 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
                # Passer un chemin qui ne commence pas par / ou est la racine.
                echo "$scptname: Passage du chemin : $f" >&2
            else
                if [[ -e "/Volumes/$volname$f" ]]; then
                    # Passer si le chemin est déjà présent dans PATH.
                    echo "$scptname: Le répertoire existe déjà : /Volumes/$volname$f" >&2
                else
                    # Créer le répertoire, marquer caché à la racine du volume et
                    # créer les liens symboliques.
                    /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. Exécuter le script pour créer les liens symboliques sur le volume étiqueté CS. Les répertoires créés à la racine du volume CS sont marqués comme cachés et donc ne seront pas affichés dans une fenêtre d'application Finder.

    sudo ./myscript CS
  4. Ajouter /Volumes/CS à la variable PATH. Voici un exemple du contenu d'une variable PATH.

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

    Après avoir ajouté /Volumes/CS, cela changerait pour ce qui suit.

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

    Remarque : Vous pourriez avoir besoin d'entrer hash -r après avoir modifié la variable PATH.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X