![Como invocar um script usando um caminho relativo com seu diretório pai mapeado em PATH?](https://rvso.com/image/1552392/Como%20invocar%20um%20script%20usando%20um%20caminho%20relativo%20com%20seu%20diret%C3%B3rio%20pai%20mapeado%20em%20PATH%3F.png)
Eu tenho uma pasta /usr/bin/vendor/
que é adicionada PATH
por 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.sh
em qualquer lugar. 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
de 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.sh
que encaminhasse todos os argumentos para /usr/bin/vendor/some_tool/do_a.pl
.
Responder1
A bash
pá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 PATH
das 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
tl
analisaria o parâmetro passado, PATH
procuraria 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.