Tengo una carpeta /usr/bin/vendor/
que se agrega PATH
por convención y que contiene, por ejemplo, el script de shell do_something.sh
. Ahora me gustaría agregar una subcarpeta /usr/bin/vendor/some_tool/
para almacenar adicionalmente uno o más scripts Perl agrupados, porque tienen el mismo propósito y necesito administrar adicionalmente archivos de proyecto de Eclipse, tal vez incluso archivos de configuración, etc. Al final, podría obtener /usr/bin/vendor/some_tool/do_a.pl
y /usr/bin/vendor/some_tool/do_b.pl
.
Gracias a PATH
, puedo invocar fácilmente do_something.sh
en todas partes. ¿Pero hay alguna manera de invocar some_tool/do_a.pl
de la misma manera? Realmente some_tool/do_a.pl
con esa ruta relativa, para saber que estoy haciendo la tarea do_a
de some_tool
. Es más o menos una convención de redacción/nomenclatura que me gustaría implementar utilizando la estructura de directorio relativa.
Lo intenté en el shell y, por supuesto, no funcionó, pero tal vez hay algo que estoy haciendo mal y debería funcionar en general. Pero supongo que no debería ser así y la única solución sería crear un archivo /usr/bin/vendor/some_tool_do_a.sh
que reenvíe todos los argumentos a /usr/bin/vendor/some_tool/do_a.pl
.
Respuesta1
La 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).
Luego continúa diciendo
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.
Entonces la respuesta parece ser "No, lo que quieres hacer no está respaldado por bash
".
Respuesta2
No, esto no es posible: cualquier /
comando escrito lo convierte en una ruta absoluta (si /
es el primer carácter), o una ruta relativa con respecto a su directorio actual, no una ruta relativa dentro de PATH
las entradas.
Una solución podría ser vincular todos los scripts /usr/bin/vendor/some_tool/
con /usr/bin/vendor/
:
ln [-s] /usr/bin/vendor/some_tool/* /usr/bin/vendor/
Se pueden utilizar enlaces duros o blandos.
Si siempre está en el mismo directorio de trabajo (o en una pequeña cantidad de directorios) cuando llama al script, entonces una respuesta más simple podría ser crear un enlace relativo desde este (o cada uno) directorio:
ln -s /usr/bin/vendor/some_tool .
En este caso, deberá utilizar enlaces simbólicos.
Otras soluciones podrían ser definir un script con un nombre corto para realizar esta función, al que llamarías con algo como:
tl some_tool/do_a.pl
tl
analizaría el parámetro pasado, PATH
buscaría paso a paso el script en cada componente y luego invocaría la ruta completa al script.
Respuesta3
Lo que hago en el script "principal":
mydir=$(dirname "$0")
"$mydir/subdir/otherscript"
entonces el guión principal siempre encuentra al niño, siempre y cuando se muevan juntos para que su posición relativa no cambie.