Encontre um arquivo no caminho sem "qual"?

12

Eu sou (de alguma forma) capaz de executar um script:

$ assemble.sh file
... [output]

Mas whichnão consegue encontrar:

$ 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. Como isso é possível?
  2. Como posso encontrar onde está esse arquivo?

Estou usando o bash.

Xodarap
fonte
Está assemble.shno seu diretório atual?
Keith
3
Provavelmente uma pergunta idiota, mas é um alias (ou seja, não assemble.sh aparecer quando você digitar o comando alias ?
James McLeod
@JamesMcLeod Great guess! Foi o meu caso do acme.sh ( github.com/Neilpang/acme.sh ). Após a instalação, o alias acme.sh foi criado e eu me perguntei como o acme.sh é chamado, apesar de não estar no PATH var.
Rlib # 16/17

Respostas:

17

Use este comando: type assemble.sh

Ele funciona em uma variedade de conchas e mostra apenas o primeiro resultado.

Glenn Jackman
fonte
9
Ou apenas type assemble.sh, que é portátil (e mostra apenas a primeira correspondência, enquanto type -aé uma construção ksh / bash para mostrar todas as correspondências).
Gilles 'SO- stop be evil'
6

Ou divida o caminho e use-o no localizador - a primeira correspondência deve ser a solução

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

type é claro que é mais fácil.

Usuário desconhecido
fonte
2
Isso é bastante útil. Eu não sabia que eu poderia dividir $ PATH em suas sub componentes e procurar cada um comfind
Ehtesh Choudhury
1
Não tentei, mas acho que isso pode romper com espaços nos componentes do PATH
encerrado em 15/07/16
4

Você pode estar usando o bash, mas a sintaxe da whichsaída mostra que você usa o antigo whichescrito em csh. O PATH aparece entre parênteses, e os diretórios no PATH têm entradas como /opt/SUNWspro/bine /usr/ccs/binque só fazem sentido no Solaris. Isso é consistente: o Solaris usou o csh which.

Aqui está o meu palpite: você tem um PATH para o bash e outro para o csh. Isso pode ser um problema do sistema. Pelo que me lembro, o Solaris mantém os arquivos / etc / profile e / etc / cshrc para a configuração de PATH em todo o sistema. Esses dois arquivos de inicialização podem definir variáveis ​​PATH diferentes para diferentes shells. Faça "echo $ PATH" em bash e verifique se ele concorda com o que o whichcomando imprime como uma sequência PATH.

Bruce Ediger
fonte
4
command -v assemble.sh

Info

-v imprime uma descrição do COMMAND similar ao `type 'embutido
Steven Penny
fonte
Também seria útil se você quiser encontrar em uma versão modificada do PATHASSEMBLE=$(PATH=/usr/bin:/usr/local/opt/coreutils/libexec/gnubin command -v assemble.sh)
encerrada 15/07/16
0

Você pode usar locate assemble.shpara encontrar o local do arquivo.

nico
fonte
Não, isso mostra a localização de todos os arquivos legíveis (mundiais) cujo nome contém assemble.sh, o que é irrelevante aqui.
Gilles 'SO- stop be evil'
Não é irrelevante. Mesmo se ele tivesse vários arquivos chamados assim locate, também lhe daria a localização do que ele deseja. assemble.shnão é um nome de arquivo tão comum, então ele provavelmente encontrará o arquivo facilmente (que é o que o OP solicita).
Nico
1
Você não precisa updatedbantes de locatemostrar resultados?
Glenn Jackman
1
Geralmente updatedbé executado diariamente como um trabalho cron, mas sim, talvez seja necessário forçá-lo se o arquivo for muito recente.
Nico