Que signifie passer par le PATH? Où sont les commandes?

Aperçu

Je déconne avec les commandes, mais où sont les commandes? Je l'entends souvent via le PATH, mais qu'est-ce que cela signifie? Cet article a été écrit pour les débutants qui y ont pensé. Je ne lis pas le code de la commande.

À propos, chaque commande est essayée sur Mac et zsh, mais c'est similaire pour la série Unix.

Conclusion

Pour conclure plus tôt, passer par le PATH signifie ** enregistrer l'emplacement de la commande externe dans le chemin de recherche de la commande afin que la commande externe puisse être exécutée sans la spécifier dans le chemin **. Les détails sont décrits ci-dessous.

Commandes internes et externes

Les commandes incluent des ** commandes internes (commandes intégrées) ** intégrées au shell et des ** commandes externes ** placées sous forme de fichiers dans un répertoire spécifique, comme indiqué ci-dessous.

パッケージ管理マネージャ.png

Où est la commande ls?

Essayons l'emplacement de la commande ls avec la commande which.

$ which ls

production:

/bin/ls

Apparemment, c'est juste sous / bin.

Qu'y a-t-il dans / bin?

Regardons maintenant à l'intérieur de / bin.

$ ls /bin

production:

[		chmod		dash		df		expr		ksh		ln		mv		pwd		sh		sync		unlink
bash		cp		date		echo		hostname	launchctl	ls		pax		rm		sleep		tcsh		wait4path
cat		csh		dd		ed		kill		link		mkdir		ps		rmdir		stty		test		zsh

Vous avez un fichier avec le même nom que votre commande préférée.

La substance de la commande externe est un fichier

Si vous regardez le contenu de la commande ls, vous pouvez voir qu'il s'agit d'un ** fichier binaire **.

$ od -h /bin/ls | more

production:

0000000      facf    feed    0007    0100    0003    0000    0002    0000
0000020      0013    0000    0710    0000    0085    0020    0000    0000
0000040      0019    0000    0048    0000    5f5f    4150    4547    455a
0000060      4f52    0000    0000    0000    0000    0000    0000    0000
(Abréviation)

Pour exécuter une commande externe

Les commandes internes sont chargées en mémoire au démarrage de l'ordinateur, mais ** les commandes externes existent en tant que fichiers sur le disque (comme sous / bin) et sont chargées à partir du disque à chaque fois **.

Cela signifie que lorsque vous exécutez une commande externe, vous pouvez ** directement spécifier le chemin pour exécuter la commande externe **.

** Exemple: exécutez la commande ls directement pour spécifier l'emplacement du fichier **


$ /bin/ls

Vous pouvez exécuter la commande comme décrit ci-dessus, mais c'est gênant, il existe donc une variable d'environnement appelée PATH. Ceci est strictement appelé ** chemin de recherche de commande (chemin de recherche de commande) **.

Même si vous ne spécifiez pas directement le chemin, le programme recherche le chemin de recherche de la commande sans autorisation, vous pouvez donc exécuter la commande ls comme indiqué ci-dessous.


$ ls

Le contenu de PATH est un groupe de répertoires contenant des commandes externes.

Pour voir le contenu de PATH une fois, utilisez la commande ʻecho pour regarder PATH`.


$ echo $PATH

production:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

En regardant les résultats, certains répertoires ont été séparés par :.

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Library/Apple/usr/bin

Ceux-ci indiquent l'emplacement (chemin) de la commande externe.

Si le PATH ne passe pas

Si vous essayez d'exécuter une commande qui ne passe pas PATH ou qui n'existe pas, vous obtiendrez ce qui suit.

** Exemple: pour zsh **

zsh: command not found: hogehoge

Si vous deviez déjà avoir saisi la commande, mais qu'elle indique «introuvable», etc. Souvent, le PATH ne passe pas.

Pour passer le CHEMIN

Ce que vous devez faire pour passer PATH est d'ajouter le chemin du répertoire où la commande que vous souhaitez utiliser est placée dans la ** variable d'environnement PATH. ** **

Par exemple, si vous souhaitez utiliser la commande php sous / hogehoge / bin Ajoutez / hogehoge / bin à la variable d'environnement PATH.

Essayez de l'ajouter en utilisant la commande ʻexport`.

$ export PATH="/hogehoge/bin:$PATH"

Vérifiez s'il a été ajouté avec ʻecho`. (Vous pouvez également essayer la commande ajoutée)

$ echo $PATH

production:

/hogehoge/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

Comme mentionné ci-dessus, vous pouvez ajouter des variables d'environnement en utilisant la commande ʻexport, mais il est difficile de les ajouter en utilisant la commande ʻexport une par une, donc fondamentalement ** dans le fichier de configuration du shell que vous utilisez. Ajouter. ** **

Cela écrasera automatiquement PATH lorsque vous démarrez le shell.

** Exemple: pour zsh **

Ajoutez en utilisant ʻexport dans le fichier .zshrc` sous le répertoire HOME.

.zshrc


export PATH="/hogehoge/bin:$PATH"

À la fin, j'ai écrit $ PATH, qui étend la variable d'environnement existante PATH. En d'autres termes, cela a la même signification que:

.zshrc


export PATH="/hogehoge/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"

À ce stade, si vous écrasez complètement l'existant, ** diverses commandes ne seront pas utilisables, alors soyez prudent. ** ** Par exemple, si vous procédez comme suit, les commandes telles que sous ** / bin ne seront pas lues. ** **

.zshrc


export PATH="/hogehoge/bin"

Comme décrit ci-dessus, la variable d'environnement "PATH" permet d'exécuter une commande externe prédéterminée sans spécifier directement le chemin. Si vous ne connaissez pas le fichier de paramètres du shell, vous pouvez vérifier le shell que vous utilisez et google comment l'écrire.

Priorité PATH

PATH a une priorité. Par exemple, dans les cas suivants, il est lu dans l'ordre depuis / hogehoge / bin sur la gauche.

PATH=/hogehoge/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

Par exemple, s'il y a des commandes php dans / hogehoge / bin et / use / local / bin respectivement,

$ php

Si vous exécutez, ce sera la commande php de / hogehoge / bin.

Comme vous pouvez le voir, lorsque vous spécifiez PATH, vous devez également faire attention à la priorité.

Différences dans l'emplacement de chaque commande (/ bin, / usr / local / bin, etc.)

L'emplacement des commandes externes est normalisé par FHS (Filesystem Hierarchy Standard) sous la forme de ** "Mettons ces commandes à cet emplacement!" **. Cela rend évident que quel que soit le système Linux avec lequel vous jouez, «ce répertoire / bin contient des commandes principales qui peuvent être utilisées même en cas d'urgence. (Cependant, bien qu'il soit standardisé, il n'est pas appliqué, de sorte que des commandes étranges peuvent se trouver dans des endroits étranges pour chaque système d'exploitation)

Le tableau ci-dessous résume les emplacements des commandes externes normalisées par celles-ci et les différences entre elles, mais regardons chacune d'elles.

annuaire Mode utilisateur unique Résumé
/bin disponible Celui qui peut être utilisé même en cas d'urgence
/usr/bin hors service Guy général
/usr/local/bin hors service Mon propre scénario
/sbin disponible Nécessite des privilèges de super utilisateur (root)
/usr/sbin hors service Nécessite des privilèges de super utilisateur (root)

/bin Placez les ** commandes externes les plus importantes ** pouvant être utilisées en mode mono-utilisateur dans ce répertoire. Le mode mono-utilisateur est utilisé en cas d'urgence, par exemple lorsque le système d'exploitation ne peut pas démarrer normalement.

Comme je l'ai confirmé au début, la commande suivante était incluse dans le / bin de mon Macbook Pro.

[		chmod		dash		df		expr		ksh		ln		mv		pwd		sh		sync		unlink
bash		cp		date		echo		hostname	launchctl	ls		pax		rm		sleep		tcsh		wait4path
cat		csh		dd		ed		kill		link		mkdir		ps		rmdir		stty		test		zsh

Si vous ne connaissez pas ces commandes, vous pouvez les rechercher et constater qu'elles sont toutes simples et importantes.

/usr/bin Au lieu de l'utiliser en mode mono-utilisateur, mettez essentiellement les commandes gérées par le gestionnaire de paquets (système de gestion de paquets). Il existe différents gestionnaires de paquets pour chaque OS, mais je ne les mentionnerai pas ici. Regardez dans le répertoire de votre machine pour voir quelles commandes sont réellement disponibles.

/usr/local/bin Placez les commandes non gérées dans Package Manager, non utilisées en mode mono-utilisateur.

À propos, homebrew, qui est un gestionnaire de paquets familier aux utilisateurs de Mac, Utilisez ce répertoire. Vous pouvez découvrir pourquoi homebrew utilise cet emplacement sur la page homebrew.

https://docs.brew.sh/FAQ#why-does-homebrew-prefer-i-install-to-usrlocal

Traduit, il dit:

Apple a attribué ce répertoire aux utilitaires non système. Cela signifie que par défaut, il n'y a pas de fichiers dans / usr / local, vous n'avez donc pas à vous soucier de ruiner vos outils existants ou système.

/ sbin et / usr / sbin

Il est fondamentalement traité de la même manière que le répertoire de chaque hiérarchie ci-dessus, mais contrairement à bin, il met des commandes administratives avec lesquelles l'administrateur système peut jouer. Ceux-ci ne sont pas disponibles pour les utilisateurs réguliers car ils nécessitent des privilèges de super utilisateur (root).

Résumé

Comme je l'ai écrit plus tôt, la conclusion est

Passer par PATH signifie enregistrer l'emplacement d'une commande externe dans le chemin de recherche de commande afin que la commande externe puisse être exécutée sans la spécifier dans le chemin.

C'était ça.

Je n'ai pas trouvé beaucoup d'articles qui mentionnent des commandes internes et des commandes externes en passant par le PATH, j'ai donc écrit cette fois.

Recommended Posts

Que signifie passer par le PATH? Où sont les commandes?
python Remarque: que signifie définir une graine avec la génération de nombres aléatoires?
Que signifie le dernier () dans une fonction en Python?
Je l'ai écrit en langage Go pour comprendre le principe SOLID
Que faire si le nom d'utilisateur est modifié et que le chemin de la bibliothèque pyenv ne passe pas
Que faire lorsque les paramètres de l'extension jupyterlab ne sont pas reflétés
Si vous essayez de démarrer le notebook jupyter installé avec pip et qu'il dit "commande introuvable", il semble que vous puissiez passer par le PATH.