Je voudrais prendre la sortie de deux commandes -
zpool list
zfs list
et pour chaque piscine trouvée:
zpool get all nameofpool
et pour chaque système de fichiers trouvé:
zfs get all nameoffilesystem
Contexte et environnement
Je fais des changements locaux au script qui fait partie intégrante d'OS X,
/usr/bin/sysdiagnose
#!/bin/sh
pour commencer- toujours exécuté avec les privilèges de superutilisateur
- parfois efficacement sans tête ( déclenché par un accord de clé ), le résultat doit donc être un fichier.
Première expérience
D'après l'exemple de # 65, supprimez tous les instantanés ZFS :
#!/bin/sh
for dataset in `zfs list -H | cut -f 1`
do
zfs get all $dataset
done
Cela fonctionne, mais pas là où il y a un espace dans le nom du jeu de données. Par exemple, où le système de fichiers est zhandy/Pocket Time Machine
la sortie comprend:
cannot open 'zhandy/Pocket': dataset does not exist
cannot open 'Time': dataset does not exist
cannot open 'Machine': dataset does not exist
Deuxième expérience
… Était basé sur la première réponse à cette question - utiliser IFS
- et rendait le script plus semblable à celui d'Apple. Voir révision 4 .
Troisième expérience
Basé sur la réponse acceptée à cette question - avec IFS
, et guillemets pour "$dataset"
:
#!/bin/sh
data_directory_path=~/Desktop
ECHO=/bin/echo
ZFS=/usr/sbin/zfs
ZPOOL=/usr/sbin/zpool
# If there exists a zfs binary, get some ZFS information
if [ -f "${ZFS}" ]
then
"${ECHO}" "Recording ZFS pool version information ..."
"${ZPOOL}" upgrade &> ${data_directory_path}/zpool\ upgrade.txt
"${ECHO}" " listing all ZFS pools ..."
"${ZPOOL}" list &> ${data_directory_path}/zpool\ list.txt
"${ECHO}" " detailed health status and verbose data error information ..."
"${ZPOOL}" status -v &> ${data_directory_path}/zpool\ status.txt
"${ECHO}" " pools that are available but not currently imported"
"${ZPOOL}" import &> ${data_directory_path}/zpool\ import.txt
"${ECHO}" "Recording ZFS file system version information ..."
"${ZFS}" upgrade &> ${data_directory_path}/zfs\ upgrade.txt
"${ECHO}" " listing all ZFS file systems ..."
"${ZFS}" list &> ${data_directory_path}/zfs\ list.txt
"${ECHO}" " all properties of each file system"
OLD_IFS=$IFS
IFS=$'\n'
for dataset in `zfs list -H | cut -f 1`
do
"${ZFS}" get all "$dataset" &> ${data_directory_path}/ZFS\ file\ system\ properties.txt
done
IFS=$OLD_IFS
"${ECHO}" "Listing the contents of /dev/dsk"
"${LS}" -@adel /Volumes &> ${data_directory_path}/ls-dev-dsk.txt
"${ECHO}" "Listing the contents of /var/zfs/dsk"
"${LS}" -@adel /Volumes &> ${data_directory_path}/ls-var-zfs-dsk.txt
fi
Parmi les fichiers résultants, ZFS file system properties.txt
répertorie les propriétés d'un seul système de fichiers ZFS: un jeu de données avec un espace dans son nom.
Le résultat final le plus souhaitable est les propriétés:
- pour tous les systèmes de fichiers ZFS
- dans un fichier.
Supprimer la chaîne suivante -
&> ${data_directory_path}/ZFS\ file\ system\ properties.txt
- obtient les propriétés de tous les systèmes de fichiers ZFS, dans une fenêtre de Terminal mais pas dans un fichier. Cela me suffit pour accepter une réponse.
Le critère de sortie dans un fichier , qui ne figurait pas dans ma première édition de la question, peut être facilement répondu ailleurs.
>>
(non &>
ou &>>
). Dans les commentaires adressés à Apple, j'ai demandé sysdiagnose
à être ajouté à Apple Open Source . Si cela se produit, je rendrai publiques mes autres modifications apportées au script, dont la plupart ne sont pas liées à ZFS.
for DS in $(zfs list -H -o name); do zfs get all "$DS"; done
? Cela fait un moment que j'utilise cet idiome dans mes propres scripts et j'espère n'avoir rien oublié (notez l'utilisation de -o name
and- "
quoting pour limiter la sortie (dont vous n'avez plus besoin cut
) et gérer les espaces dans les noms de jeu de données (même si espace est supposé être un caractère invalide pour les noms de jeu de données)