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.
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.
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.
Essayons l'emplacement de la commande ls
avec la commande which
.
$ which ls
production:
/bin/ls
Apparemment, c'est juste sous / 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.
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)
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
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 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.
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.
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é.
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.
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).
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.