Trouver un fichier dans le chemin sans «lequel»?

12

Je suis (en quelque sorte) capable d'exécuter un script:

$ assemble.sh file
... [output]

Mais whichje ne le trouve pas:

$ which assemble.sh
which: no assemble.sh in (/s/std/bin:/usr/afsws/bin:/opt/SUNWspro/bin:/usr/ccs/bin:/usr/ucb:/bin:/usr/bin:/usr/stat/bin:/usr/X11R6/bin:.
  1. Comment est-ce possible?
  2. Comment puis-je trouver où se trouve ce fichier?

J'utilise bash.

Xodarap
la source
Est assemble.shdans votre répertoire actuel?
Keith
3
Probablement une question stupide, mais est-ce un alias (c.- alias
James McLeod
@JamesMcLeod Grande conjecture! C'était mon cas pour acme.sh ( github.com/Neilpang/acme.sh ). Après l'installation, l'alias acme.sh a été créé et je me demandais comment acme.sh était appelé bien qu'il ne soit pas dans PATH var.
rlib

Réponses:

17

Utilisez cette commande: type assemble.sh

Il fonctionne dans une variété de coques et ne montre que le premier résultat.

glenn jackman
la source
9
Ou tout simplement type assemble.sh, qui est portable (et ne montre que la première correspondance alors que type -ac'est une construction ksh / bash pour afficher toutes les correspondances).
Gilles 'SO- arrête d'être méchant'
6

Ou divisez le chemin et utilisez-le dans la recherche - la première correspondance devrait être la solution

find ${PATH//:/ } -maxdepth 1 -name assemble.sh -print -quit

type est bien sûr plus facile.

Utilisateur inconnu
la source
2
C'est assez utile. Je ne savais pas que je pouvais diviser $ PATH en ses sous-composants et rechercher chacun avecfind
Ehtesh Choudhury
1
Je n'ai pas essayé, mais je suppose que cela peut rompre avec les espaces dans les composants de PATH
nhed
4

Vous utilisez peut-être bash, mais la syntaxe de la whichsortie montre que vous utilisez l'ancien whichécrit en csh. Le PATH apparaît entre parenthèses et les répertoires de PATH ont des entrées comme /opt/SUNWspro/binet /usr/ccs/binqui n'ont de sens que dans Solaris. C'est cohérent: Solaris a utilisé le csh which.

Voici ma supposition: vous avez un CHEMIN pour bash et un autre pour csh. Cela pourrait être un problème système. Si je me souviens bien, Solaris conserve les fichiers / etc / profile et / etc / cshrc pour le paramètre PATH à l'échelle du système. Ces deux fichiers d'initialisation peuvent définir des variables PATH différentes pour différents shells. Faites "echo $ PATH" sous bash, et voyez si cela correspond à ce que la whichcommande affiche comme une chaîne PATH.

Bruce Ediger
la source
4
command -v assemble.sh

Info

-v affiche une description de COMMAND similaire à la commande intégrée `type '
Steven Penny
la source
Serait également utile si vous souhaitez trouver dans une version modifiée de PATHASSEMBLE=$(PATH=/usr/bin:/usr/local/opt/coreutils/libexec/gnubin command -v assemble.sh)
nhed
0

Vous pouvez utiliser locate assemble.shpour trouver l'emplacement du fichier.

Nico
la source
Non, cela montre l'emplacement de tous les fichiers lisibles (dans le monde) dont le nom contient assemble.sh, ce qui n'est pas pertinent ici.
Gilles 'SO- arrête d'être méchant'
Ce n'est pas du tout hors de propos. Même s'il avait plusieurs fichiers appelés comme ça, locatecela lui donnerait également l'emplacement de celui qu'il voulait. assemble.shn'est pas un nom de fichier commun, il trouvera donc probablement le fichier facilement (c'est ce que l'OP demande).
nico
1
N'avez-vous pas à voir les résultats updatedbavant locate?
glenn jackman
1
Il updatedbest généralement exécuté quotidiennement en tant que tâche cron, mais oui, vous devrez peut-être le forcer si le fichier est très récent.
nico