Como invocar um script usando um caminho relativo com seu diretório pai mapeado em PATH?

Como invocar um script usando um caminho relativo com seu diretório pai mapeado em PATH?

Eu tenho uma pasta /usr/bin/vendor/que é adicionada PATHpor convenção e contém, por exemplo, o shell script do_something.sh. Agora eu gostaria de adicionar uma subpasta para armazenar adicionalmente um ou /usr/bin/vendor/some_tool/mais scripts Perl agrupados, porque eles têm a mesma finalidade e preciso gerenciar adicionalmente os arquivos do projeto Eclipse, talvez até arquivos de configuração, etc./usr/bin/vendor/some_tool/do_a.pl/usr/bin/vendor/some_tool/do_b.pl

Por causa disso PATH, posso invocar facilmente do_something.shem qualquer lugar. Mas existe alguma maneira de invocar some_tool/do_a.plda mesma maneira? Realmente some_tool/do_a.plcom esse caminho relativo, para que eu saiba que estou fazendo a tarefa do_ade some_tool. É praticamente uma convenção de redação/nomeação que eu gostaria de implementar usando a estrutura de diretório relativa.

Tentei isso no shell e não funcionou, é claro, mas talvez haja algo que estou fazendo errado e deve funcionar em geral. Mas acho que não deveria e a única solução alternativa seria criar um arquivo /usr/bin/vendor/some_tool_do_a.shque encaminhasse todos os argumentos para /usr/bin/vendor/some_tool/do_a.pl.

Responder1

A bashpágina de manual especifica

   PATH   The  search  path for commands.  It is a colon-separated list of
          directories in which the shell looks for commands  (see  COMMAND
          EXECUTION  below).

Em seguida, continua dizendo

   If  the name is neither a shell function nor a builtin, and contains no
   slashes, bash searches each element of the PATH for  a  directory  con‐
   taining  an  executable  file  by that name.

Portanto, a resposta parece ser "Não, o que você deseja fazer não é suportado por bash".

Responder2

Não, isso não é possível: qualquer /comando digitado o transforma em um caminho absoluto (se /for o primeiro caractere) ou um caminho relativo em relação ao seu diretório atual, não um caminho relativo dentro PATHdas entradas.

Uma solução alternativa pode ser vincular todos os scripts /usr/bin/vendor/some_tool/a /usr/bin/vendor/:

ln [-s] /usr/bin/vendor/some_tool/* /usr/bin/vendor/

Podem ser usados ​​links físicos ou virtuais.

Se você estiver sempre no mesmo diretório de trabalho (ou em um pequeno número de diretórios) ao chamar o script, uma resposta mais simples seria criar um link relativo a partir deste (ou de cada) diretório:

ln -s /usr/bin/vendor/some_tool .

Neste caso, você precisa usar link(s) simbólico(s).

Outras soluções alternativas podem ser definir um script com um nome abreviado para executar esta função, que você chamaria com algo como:

tl some_tool/do_a.pl

tlanalisaria o parâmetro passado, PATHprocuraria o script em cada componente e, em seguida, invocaria o caminho completo para o script.

Responder3

O que faço no script "principal":

mydir=$(dirname "$0")
"$mydir/subdir/otherscript"

então o script principal sempre encontra o filho, desde que eles sejam movidos juntos para que sua posição relativa não mude.

informação relacionada