Question

J'utilise le chdir() C fonction pour permettre à un utilisateur de modifier le répertoire.

La fonction ne reconnaît cependant pas '~'. Dois-je faire une conversion explicite, donc chdir ne reconnaît pas ce que signifie ~? Parce que le mien ne fonctionne pas. Ou est-ce que je fais quelque chose de mal?

Était-ce utile?

La solution

L'expansion de Tilde est gérée par la coquille, et non par un appel système. Vous pourriez utiliser getenv() Pour lire la variable d'environnement HOME puis utilisez-le comme argument pour chdir().

Il existe des appels système pour obtenir ces informations qui peuvent être plus fiables sur un système individuel, mais ils ne sont pas complètement portables. Regardez, par exemple, à getPwuid ().

Autres conseils

Notez que Posix Spécifie la sémantique de l'expansion de Tilde:

2.6.1 Expansion de Tilde

Un "tilde-prefix" se compose d'un <tilde> personnage au début d'un mot, suivi de tous les personnages précédant le premier <slash> dans le mot, ou tous les caractères du mot s'il n'y a pas <slash>. Dans une affectation (voir Affectation de variable XBD), plusieurs préfixes Tilde peuvent être utilisés: au début du mot (c'est-à-dire en suivant le <equals-sign> de l'affectation), suivant tout <colon>, ou les deux. Un préfixe Tilde dans une affectation est résilié par le premier non <colon> ou <slash>. Si aucun des caractères du préfixe Tilde n'est cité, les caractères du préfix de tilde suivant le <tilde> sont traités comme un nom de connexion possible de la base de données utilisateur. Un nom de connexion portable ne peut pas contenir de caractères en dehors de l'ensemble donné dans la description de la variable d'environnement Logname dans XBD d'autres variables d'environnement. Si le nom de connexion est nul (c'est-à-dire le tilde-prefix ne contient que le tilde), le tilde-prefix est remplacé par la valeur de la variable HOME. Si HOME n'est pas défini, les résultats ne sont pas spécifiés. Sinon, le préfixe Tilde doit être remplacé par un chemin d'accès du répertoire de travail initial associé au nom de connexion obtenu en utilisant le getpwnam() Fonction telle que définie dans le système d'interfaces système de POSIX.1-2008. Si le système ne reconnaît pas le nom de connexion, les résultats ne sont pas définis.

Notez en particulier que si mon nom d'utilisateur est me, les résultats de cd ~ et cd ~me peut ne pas être pareil! Plus précisément, le HOME La variable d'environnement pourrait être définie sur une valeur différente de celle renvoyée par getpwnam(). J'utilise cette technique depuis (bien plus de 25 ans) pour définir mon HOME où je le veux, et les quelques programmes qui ne reconnaissent pas la différence entre cd ~ et cd ~me sont quelques (des nombreuses) banes de ma vie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top