usage - getopt bash arguments



Détecter si le chemin de l'utilisateur possède un répertoire spécifique (5)

Avec /bin/bash , comment détecter si un utilisateur a un répertoire spécifique dans sa variable $ PATH?

Par exemple

if [ -p "$HOME/bin" ]; then
  echo "Your path is missing ~/bin, you might want to add it."
else
  echo "Your path is correctly set"
fi

https://src-bin.com


Answer #1

C'est une approche par force brute, mais cela fonctionne dans tous les cas sauf quand une entrée de chemin contient un deux-points. Et aucun programme autre que le shell n'est utilisé.

previous_IFS=$IFS
dir_in_path='no'
export IFS=":"
for p in $PATH
do
  [ "$p" = "/path/to/check" ] && dir_in_path='yes'
done

[ "$dir_in_path" = "no" ] && export PATH="$PATH:/path/to/check"
export IFS=$previous_IFS

Answer #2

Il n'y a absolument aucun besoin d'utiliser des utilitaires externes comme grep pour cela. Voici ce que j'ai utilisé, qui devrait être portable à même les versions héritées du shell Bourne.

case :$PATH: # notice colons around the value
  in *:$HOME/bin:*) ;; # do nothing, it's there
     *) echo "$HOME/bin not in $PATH" >&2;;
esac

Answer #3

L'utilisation de grep est excessive et peut causer des problèmes si vous recherchez tout ce qui se passe pour inclure des métacaractères RE. Ce problème peut être résolu parfaitement avec la commande intégrée [[ command:

if [[ ":$PATH:" == *":$HOME/bin:"* ]]; then
  echo "Your path is correctly set"
else
  echo "Your path is missing ~/bin, you might want to add it."
fi

Notez que l'ajout de deux-points avant l'expansion de $ PATH et le chemin à rechercher résout le problème de correspondance de sous-chaîne; La double-citation du chemin évite les problèmes avec les métacaractères.


Answer #4

Quelque chose de vraiment simple et naïf:

echo "$PATH"|grep -q whatever && echo "found it"

Où est ce que vous recherchez. Au lieu de && vous pouvez mettre $? dans une variable ou utilisez une instruction if correcte.

Les limitations incluent:

  • Ce qui précède correspondra aux sous-chaînes de plus grands chemins (essayez de faire correspondre sur "bin" et il le trouvera probablement, malgré le fait que "bin" ne soit pas dans votre chemin, / bin et / usr / bin sont)
  • Ce qui précède ne développera pas automatiquement les raccourcis comme ~

Ou en utilisant un perl doublure:

perl -e 'exit(!(grep(m{^/usr/bin$},split(":", $ENV{PATH}))) > 0)' && echo "found it"

Cela a toujours la limitation qu'il ne fera aucune expansions de coquille, mais il n'échoue pas si une sous-chaîne correspond. (La correspondance ci-dessus " /usr/bin ", dans le cas où ce n'était pas clair).


Answer #5

$PATH est une liste de chaînes séparées par : qui décrivent une liste de répertoires. Un répertoire est une liste de chaînes séparées par / . Deux chaînes différentes peuvent pointer vers le même répertoire (comme $HOME et ~ , ou /usr/local/bin et /usr/local/bin/ ). Nous devons donc fixer les règles de ce que nous voulons comparer / vérifier. Je suggère de comparer / vérifier les chaînes entières, et non pas les répertoires physiques, mais supprimer les doublons et les suivis.

Supprimez d'abord duplicate et trailing / de $PATH :

echo $PATH | tr -s / | sed 's/\/:/:/g;s/:/\n/g'

Supposons maintenant que $d contienne le répertoire que vous voulez vérifier. Ensuite, placez la commande précédente pour vérifier $d dans $PATH .

echo $PATH | tr -s / | sed 's/\/:/:/g;s/:/\n/g' | grep -q "^$d$" || echo "missing $d"




path