¿Cómo invocar un script usando una ruta relativa con su directorio principal asignado a PATH?

¿Cómo invocar un script usando una ruta relativa con su directorio principal asignado a PATH?

Tengo una carpeta /usr/bin/vendor/que se agrega PATHpor 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.ply /usr/bin/vendor/some_tool/do_b.pl.

Gracias a PATH, puedo invocar fácilmente do_something.shen todas partes. ¿Pero hay alguna manera de invocar some_tool/do_a.plde la misma manera? Realmente some_tool/do_a.plcon esa ruta relativa, para saber que estoy haciendo la tarea do_ade 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.shque reenvíe todos los argumentos a /usr/bin/vendor/some_tool/do_a.pl.

Respuesta1

La 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).

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 PATHlas 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

tlanalizaría el parámetro pasado, PATHbuscarí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.

información relacionada