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

1

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

Por causa de PATH , posso facilmente invocar do_something.sh em todos os lugares. Mas existe alguma maneira de invocar some_tool/do_a.pl da mesma maneira? Realmente some_tool/do_a.pl com esse caminho relativo, para que eu saiba que estou fazendo a tarefa do_a of some_tool . É praticamente uma convenção de nomenclatura / nomenclatura que gostaria de implementar usando a estrutura relativa do diretório.

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

    
por Thorsten Schöning 01.02.2018 / 18:54

3 respostas

1

A página bash man 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, ele diz

   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.

Assim, a resposta parece ser "Não, o que você deseja fazer não é compatível com bash ".

    
por 01.02.2018 / 19:10
2

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

Uma rodada de trabalho pode ser vincular todos os scripts em /usr/bin/vendor/some_tool/ a /usr/bin/vendor/ com:

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

É possível usar links físicos ou flexíveis.

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 poderá ser criar um link relativo a partir desse (ou de cada) diretório:

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

Nesse caso, você precisa usar links simbólicos.

Outras rodadas de trabalho podem ser definir um script com um nome curto para executar essa função, a qual você chamaria com algo como:

tl some_tool/do_a.pl

tl iria analisar o parâmetro passado, percorrer PATH procurando o script em cada componente e, em seguida, invocar o caminho completo para o script.

    
por 01.02.2018 / 19:14
0

O que eu 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.

    
por 01.02.2018 / 20:14