Question:
Erreurs de la commande whatis. Impossible de reconstruire la base de données avec makewhatis?
Austin Riba
2019-10-31 22:28:17 UTC
view on stackexchange narkive permalink

Comment puis-je mettre à jour la base de données whatis ?

  $ sudo / usr / libexec / makewhatis
Mot de passe:
makewhatis: /usr/share/man/whatis.tmp: système de fichiers en lecture seule
 

Je pense que la mise à jour de cette base de données résoudra un autre problème que je rencontre. Mon chemin vers la découverte comme suit ...

J'ai récemment commencé à remarquer que les finitions des coquillages de poisson étaient extrêmement lentes sur ma machine, peut-être peu de temps après la mise à niveau vers Catalina.

J'ai fait un petit profilage avec fish -d5 et j'ai remarqué que la majorité du temps était consacrée à la commande apropos . J'ai lu et appris que les outils apropos , whatis et makewhatis sont tous liés. Ils indexent les pages de manuel et les rendent consultables. Fish Shell les utilise (correctement) pour offrir des compléments utiles.

Lorsque j'exécute whatis ou apropos de manière autonome, j'obtiens le résultat suivant:

  $ whatis man
hugo-gen-man (1) - Génère des pages de manuel pour la CLI Hugo
groff_man (7) - macros groff `man 'pour prendre en charge la génération de pages de manuel
groffer (1) - affiche les fichiers groff et les pages man ~ sur X et tty
man (1) - formate et affiche les pages de manuel en ligne
man.conf (5) - données de configuration pour man
zshall (1) - la page méta-man du shell Z
xml2man (1) - Traducteur MPGL vers mdoc (page de manuel)
makewhatis: /usr/lib/./libgutenprint.2.dylib: aucun fichier ou répertoire de ce type
makewhatis: /usr/lib/libsasl2.2.0.1.dylib: pas un répertoire
makewhatis: /usr/lib/libldap.dylib: pas un répertoire
makewhatis: /usr/lib/libsqlite3.0.dylib: pas un répertoire
makewhatis: /usr/lib/libcom_err.dylib: pas un répertoire
...
 

Suivi par au moins 100 lignes supplémentaires des messages "Pas un répertoire". Je crois que ce sont toutes ces lignes inutiles qui ralentissent les choses.

J'ai donc pensé que j'avais peut-être juste besoin de reconstruire la base de données whatis (peut-être après la mise à jour de Catalina?).Cependant, cela ne semble pas fonctionner:

  $ sudo / usr / libexec / makewhatis
Mot de passe:
makewhatis: /usr/share/man/whatis.tmp: système de fichiers en lecture seule
 

Cette partie est donc un peu dérangeante.Comment puis-je reconstruire la base de données whatis?Je pense que cela résoudra mes problèmes si je peux le comprendre.

Veuillez ne pas ajouter de réponses directement à la question, postez-la plutôt comme réponse ci-dessous afin que les personnes à la recherche de réponses la trouvent là où elles espèrent trouver des réponses.
@nohillside Je n’ai pas de réponse.Il existe une astuce pour contourner un effet secondaire.Mais pas de réponse à la question réelle.
Eh bien, c'est * une * solution, au moins temporaire.Cela vaut la peine de partager.
Sept réponses:
Hambly
2019-11-20 17:47:34 UTC
view on stackexchange narkive permalink

Ce qui suit peut être utilisé comme solution de contournement pour la version macOS 10.15.1 de la commande apropos, dans laquelle elle crache des plaintes de la forme makewhatis: / usr / lib / lib… .dylib: Pas un répertoire.

Commencez par créer le script de contournement:

  $ mkdir -p ~ / solutions de contournement
$ sed -e 66s @ / usr / lib @@ / usr / bin / apropos > ~ / contournements / apropos.macos_10.15.1
$ diff / usr / bin / apropos ~ / contournements / apropos.macos_10.15.1
66c66
< pour d dans / var / cache / man $ manpath / usr / lib
---
> pour d dans / var / cache / man $ manpath
$ chmod + x ~ / solutions de contournement / apropos.macos_10.15.1
 

Ensuite, ajoutez un alias à votre shell pour lui dire d'utiliser le script de contournement, jusqu'à ce qu'une version plus récente du script canonique soit disponible.

Pour Zsh, vous pouvez utiliser la commande suivante:

  $ / bin / cat <<END >> ~ / .zshrc
# Solution de contournement pour la commande apropos cassée.
alias apropos = ~ / contournements / apropos.macos_10.15.1
FIN
 

Pour d'autres shells tels que ksh ou bash, utilisez ~ / .profile ou ~ / .bash_profile, selon le cas.

WQue fait la solution de contournement?

Les requêtes à propos (et les requêtes man -k) sont gérées par le script / usr / bin / apropos . Ce script recherche les fichiers de base de données «whatis» dans tous les répertoires du chemin man (voir man —path ), plus / var / cache / man et / usr / lib . Les vérifications pour / var / cache / man / whatis et / usr / lib / whatis semblent être là pour des raisons historiques, mais ces fichiers ne sont pas générés activement dans Mojave ou Catalina. Beaucoup de personnes différentes ont contribué aux différentes saveurs d'Unix au fil des ans, et beaucoup d'entre elles avaient différentes bonnes idées sur l'emplacement des différents types de fichiers. À un moment donné, quelqu'un a décidé que / usr / lib serait un bon endroit pour mettre un fichier whatis, et à un autre moment, quelqu'un d'autre a pensé que / var / cache / man serait un bon endroit. D'autres ont pensé que l'emplacement approprié serait les répertoires respectifs des pages de manuel. Différentes solutions qui semblaient appropriées à l'époque. Le script apropos a traditionnellement vérifié ces emplacements au cas où un fichier whatis serait présent.

Avec le passage à la lecture seule des répertoires système sur Catalina (une bonne idée), les fichiers de base de données whatis ne peuvent pas être écrits dans des répertoires tels que / usr / share / man . Apple peut gérer cela de différentes manières, mais pour cette version, quelqu'un a décidé de modifier le script apropos en le faisant générer des résultats à la volée en appelant /usr/libexec/makewhatis.local pour n'importe quelle page de manuel répertoire qui ne contient pas de fichier whatis.

Ce nouveau code apropos fonctionne bien pour les répertoires réels des pages de manuel et pour / var / cache / man (puisqu'il n'existe pas), mais il échoue pour / usr / lib . La solution de contournement détaillée ci-dessus élimine simplement / usr / lib de la liste des répertoires recherchés.

En guise de dernière étape, fixez-vous un rappel pour un mois ou deux à partir de maintenant pour vérifier si Apple a corrigé le script apropos.Si tel est le cas, supprimez vos solutions de contournement en supprimant l'alias et le script de contournement.

Si seulement Apple engageait des entrepreneurs ou mettait des primes pour que les gens puissent réparer des choses comme ça pour nous tous.+ beaucoup - merci d'avoir expliqué précisément ce qu'Apple a cassé du côté Unix en créant leur système de fichiers en lecture seule.
Je viens de rencontrer ce problème (`makewhatis: ... Pas un répertoire`) avec Catalina, et j'étais vraiment heureux de voir cette solution bien expliquée ici.Merci.
Dans le passé, j'ai essayé de créer des partitions critiques dans d'autres versions d'Unix en lecture seule.C'est une bonne idée du point de vue de la sécurité, mais difficile à faire.Il existe de nombreux cas où des partitions qui pourraient théoriquement être rendues en lecture seule ont des éléments qui s'attendent à être inscriptibles.Finalement, j'ai arrêté de suivre cette politique car elle nécessitait trop de solutions de contournement.Je suis donc heureux de voir la décision d'Apple de verrouiller le système en tant que politique O / S, j'espère juste qu'ils ne le maintiendront pas verrouillé si étroitement qu'ils empêchent l'auto-correction du système.
Pour être honnête: je n'utiliserais pas de solution de contournement mais modifierais les fichiers d'origine.Aucun des fichiers en question n'est signé cert et rien ne cassera: désactivez SIP, démarrez normalement, montez / rw et modifiez les fichiers d'origine (et ajoutez divers chemins dans manpath), reconstruisez ce qui est, activez SIP et démarrez normalement.Testé et tout fonctionne.
Je suis d'accord, la désactivation de SIP et la correction directe du code est meilleure qu'une solution de contournement aliasée.Je ne savais pas qu'un utilisateur standard pouvait désactiver temporairement SIP;cependant, la procédure était facile à trouver une fois que je savais quoi chercher.Merci d'avoir fait remarquer cela.
Il est décevant que cela n'ait pas été corrigé dans la mise à jour macOS 15.2.
J'ai dû faire la même chose pour `/ usr / bin / whatis` (et j'ai alias` whatis` sur la solution de contournement) pour que cela fonctionne.
Cela semble corrigé dans macOS 10.15.4.Je n'ai trouvé aucune annonce confirmant cela.Cependant, peut-être que cela a été corrigé en modifiant makewhatis.La date / usr / libexec / makewhatis a été modifiée pour la dernière fois est maintenant "17 mars 11:42".
TinkerBear
2019-11-03 02:45:15 UTC
view on stackexchange narkive permalink

Je viens de tomber sur ceci et j'ai cherché mon chemin ici ...

On dirait que "whatis" va soit greper les fichiers whatis générés, soit les générer à la volée vers la sortie standard. Ce que nous voyons est la sortie de "makewhatis" en cours d'exécution sur / usr / lib.

Vous obtiendrez les mêmes erreurs de:

  / usr / libexec / makewhatis -o / dev / fd / 1 / usr / lib
 

/ usr / lib n'est pas dans le manpath (sortie de "man --path") - il est ajouté explicitement par "whatis", mais pour quelle raison je n'en ai aucune idée. Il n'y a pas de pages de manuel, et makewhatis s'attend clairement à ce que tout dans un dossier man soit un sous-répertoire.

Si nous pouvions éditer le script "whatis", nous pourrions le corriger. Mais nous ne pouvons pas, car / usr / bin est en lecture seule.

Si nous pouvions générer un / usr / lib / whatis vide, les plaintes cesseraient. Mais nous ne pouvons pas car / usr / lib est en lecture seule.

Il est peut-être possible de corriger /usr/libexec/makewhatis.local pour arrêter ce non-sens, mais il est en lecture seule.

J'ai besoin de faire quelques recherches pour voir s'il existe un moyen d'obtenir un peu de lecture-écriture sur le volume du système d'exploitation.

Sur une note connexe: même si nous avons réussi à exécuter un "makewhatis", il ne générera pas / usr / lib / whatis, car / usr / lib n'est pas dans le chemin de l'homme ... donc il a gagné ' t résoudre ce problème. Créer un / usr / lib / whatis vide est probablement l'option la plus simple et la plus sûre, si nous pouvons comprendre comment.

klanomath
2019-11-03 05:51:03 UTC
view on stackexchange narkive permalink

Essayez celui-ci ():

  1. sudo mkdir / System / Volumes / Data / usr / share / man
  2. sudo / usr / libexec / makewhatis -o / System / Volumes / Data / usr / share / man / whatis
  3.   utilisateur @ hôte ~% cd / System / Volumes / Data / usr / share / man /
    utilisateur @ hôte homme% lsl
    total 384
    drwxr-xr-x 3 roue racine - 96 novembre 3 01:33.
    drwxr-xr-x 4 roue racine sunlnk 128 3 novembre 01:32 ..
    -rw-r - r-- 1 roue racine - 160236 3 novembre 01:33 whatis
     

    lsl est un alias pour ls -laOe @ sur mon système

Faits amusants:

  • Je ne sais pas où se trouve ce fichier (sauf que le fichier est là) - le fichier ne peut pas être trouvé avec sudo find / -name "whatis" dans le système de fichiers
  • Le fichier survit à un redémarrage
  • Je ne sais pas si ce fichier est utilisé par la complétion de whatis / apropos / fish | bash | zsh shell (et résout vos problèmes)
Bonne idée, mais malheureusement ce qui est / apropos ne semble pas utiliser le fichier watis placé dans / System / Volumes / Data / usr / share / man
Hambly
2019-11-19 12:09:25 UTC
view on stackexchange narkive permalink

R Concernant une solution qui générerait les fichiers whatis manquants:

La solution pour mettre à jour la base de données "whatis" dans / usr / share / man nécessite un correctif d'Apple. Ils doivent soit ajouter / usr / share / man à leur liste de liens d'entreprise (similaire à l'implémentation pour / usr / share / snmp ), soit ajouter une copie statique du fichier whatis sur le volume système.

Les liens fermes sont une nouvelle fonctionnalité de l'APFS; conçu pour prendre en charge la fusion de volumes en lecture-écriture avec des volumes système en lecture seule. À partir de la version de Catalina, les fichiers du système d'exploitation de base sont conservés sur un volume en lecture seule, qui est ensuite fusionné avec un volume de données en lecture-écriture via l'utilisation de liens fermes. Sous macOS version 10.15.1, / usr / share / man n'est présent que sur le volume système en lecture seule. Vous pouvez ajouter une entrée pour / usr / share / man au volume de données en créant le répertoire / System / Volumes / Data / usr / share / man , comme démontré par réponse de klanomath, mais elle ne sera pas mappée sur le répertoire système (/ usr / share / man) tant qu’un lien d’entreprise correspondant n’a pas été créé.

Une liste des firmlinks actuels peut être trouvée dans / usr / share / firmlinks . La documentation que j'ai pu fouiller jusqu'à présent n'est pas claire quant à savoir si firmlinks est un fichier de référence, ou un fichier de configuration, mais cela me ressemble à un fichier de configuration qui est lu et utilisé dans le cadre des procédures de démarrage. En supposant qu'il s'agit d'un fichier de configuration, vous pouvez théoriquement corriger le problème en ajoutant une entrée pour / usr / share / man au fichier.

Malheureusement, puisque / usr / share / firmlinks est hébergé dans le volume système en lecture seule, vous ne pouvez pas le modifier en tant qu'utilisateur, ni même en tant que super-utilisateur.Même en mode mono-utilisateur, le montage du groupe de volumes système en mode lecture-écriture est interdit (c'est-à-dire que / sbin / mount -uw / ne fonctionne pas).Il peut être possible de monter en lecture / écriture le volume système en tant que lecteur subsidiaire sur un système secondaire, puis d'effectuer les modifications;mais c’est plus de temps d’expérimentation que je n’étais prêt à en consacrer.

En bref, la sécurité améliorée de Catalina empêche la mise à jour de ce répertoire jusqu'à ce qu'Apple corrige le problème.

Les notes ci-dessus sont relatives à Catalina (macOS v 10.15.1).Comme il s'agit d'une solution simple, je pense que le problème sera bientôt corrigé.

Malheureusement, l'ajout d'une autre ligne dans le fichier firmlinks n'est pas suffisant pour obtenir un firmlink (déjà testé beaucoup plus tôt).Une autre étape au niveau du système de fichiers est nécessaire pour lier les deux dossiers pour obtenir un firmlink fonctionnel.
Tim
2020-02-22 05:46:25 UTC
view on stackexchange narkive permalink

Je viens de trouver ce problème aujourd'hui et j'ai créé les alias suivants dans ~ / .zshrc pour nettoyer la sortie de la commande:

  alias apropos = "apropos 2> / dev / null"
alias whatis = "whatis 2> / dev / null"
 

Les alias suppriment les erreurs de la sortie en utilisant la redirection. Le shell a deux descripteurs de fichier pour la sortie.La sortie standard est le descripteur de fichier 1 et la sortie d'erreur standard est le descripteur de fichier 2. Les erreurs générées par le script makewhatis.local sont envoyées à la sortie d'erreur standard.

La redirection de la sortie d'erreur standard se fait en utilisant le descripteur de fichier stderr «2», l'opérateur de redirection de sortie «>» et le fichier de destination «/ dev / null».Le fichier / dev / null est un objet de système de fichiers spécial qui supprime tout ce qui y est écrit.Avec les erreurs redirigées, seuls les résultats souhaités sont affichés.

Il est utile d’expliquer ce que font ces commandes.
user62627
2019-11-22 08:46:47 UTC
view on stackexchange narkive permalink

Catalina a enfreint la commande man.

Pour ignorer les messages d'erreur sous / bin / bash , créez un alias pour man:

  alias man = '/ usr / bin / man 2> / dev / null'
 
Austin Riba
2020-04-24 22:05:20 UTC
view on stackexchange narkive permalink

Je pense que cela est corrigé dans MacOs 10.15.4.Merci à @minopret de l'avoir signalé dans les commentaires sur la question initiale.L'exécution des commandes whatis ou apropos non modifiées n'entraîne pas d'erreurs.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...