2 votes

Trouver le point de montage d'un périphérique dans des scripts shell.

À la recherche d'un moyen correct et simple de trouver un point de montage dans un script shell.

Ceci fonctionne comme prévu

tmp=$(mktemp /tmp/my.XXXXXX)
mpoint=$(diskutil info -plist disk1s1 >"$tmp" ; /usr/libexec/PlistBuddy -c 'Print MountPoint' "$tmp")
rm -f "$tmp"

mais cela nécessite un fichier temporaire.

Il n'est pas bien grave, mais ce serait quand même plus agréable de le faire sans utiliser de tempfile.

Malheureusement, le

/usr/libexec/PlistBuddy -c 'Print MountPoint' <(diskutil info -plist disk1s1)

ne fonctionne pas.

Est-ce un bug de PlistBuddy ou ai-je manqué quelque chose?

Utilisant zsh dans une nouvelle installation de Big Sur.

2voto

Michael Zhou Points 167

Utilisez une chaîne ici pour passer la sortie de diskutil en entrée standard.

/usr/libexec/PlistBuddy -c "Print :MountPoint" /dev/stdin <<< "$(diskutil info -plist disk1s1)"

0 votes

Très sauvage construction, mais qui fonctionne... :D merci :D

1voto

staffan Points 3299

C'est une limitation de PlistBuddy qu'il ne peut lire que depuis un fichier, pas depuis un tube. Les constructions comme … | /usr/libexec/PlistBuddy /dev/stdin et /usr/libexec/PlistBuddy /dev/stdin <(…) utilisent un tube pour brancher la sortie de dans l'entrée de PlistBuddy. Vous devez utiliser un fichier temporaire. Mais vous pouvez demander au shell de le faire pour vous. Les here-documents et les here-strings utilisent un fichier temporaire, tout comme la =(…) substitution de processus:

/usr/libexec/PlistBuddy -c 'Print MountPoint' <

``

En fonction de ce que vous faites, vous pouvez peut-être obtenir des informations sur le point de montage à partir de df à la place.

df -P |awk '$1 == "/dev/disk1s1" {print $6}'

(Notez que cette version simple ne gère pas correctement les chemins de points de montage contenant des espaces.)

``

0 votes

Les premières deux commandes PlistBuddy ne fonctionnent pas du tout (elles affichent un message d'erreur Usage:....). La dernière (avec le =() fonctionne bien. L'analyse de la sortie de df n'est pas universelle, par exemple, votre commande échouera si le chemin de point de montage contient un espace, comme /Chemin/vers Point de Montage. La sortie de diskutil en xml-plist aura toujours la valeur correcte. Merci quand même pour la réponse. :)

1voto

JayB Points 251

Une solution sans PlistBuddy serait :

diskutil info /dev/disk1s1 | awk '/Mount Point:/{print substr($0, index($0,$3))}'

La solution avec df aurait soi-disant des problèmes si vous avez un espace dans votre chemin, comme l'a écrit @clt60 ci-dessus, donc vous auriez besoin de quelque chose comme

df -P | awk '$1 == "/dev/disk1s1" {print substr($0, index($0,$6))}'

0voto

Igor Zelaya Points 2266

Une autre solution awk, avec cette astuce:

diskutil info /dev/disk1s1 | awk '/Mount Point:/{$1=$2="";$0=$0;$1=$1;print}

L'astuce consiste à forcer awk à re-analyser les champs après avoir supprimé les deux premiers champs.

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