Búsqueda recursiva de un binario en los padres del directorio actual a través de $PATH jerárquico

Búsqueda recursiva de un binario en los padres del directorio actual a través de $PATH jerárquico

Quiero tener algunos binarios/comandos adicionales disponibles cuando estoy en la terminal, activados por el CWD.

Sea la siguiente la estructura del directorio como ejemplo.

├── P1
|   ├── mybin
|   │   └── cmd1
|   ├── S1
|   │   └── mybin
|   │       └── cmd2
|   ├── S2
└── P2
    └── S3

Luego en esta estructura de directorios

  • cmd1y cmd2están disponibles en P1/S1.
  • sólo cmd1está disponible en P1o P1/S2.
  • ninguno está disponible en P2oP2/S3

En general, quiero que esto funcione con cualquier estructura de directorios. Esto es similar a cómo git detecta si estás en un repositorio de git. Es equivalente a ponerse ./mybin, ../mybin, .../../mybin$PATH

¿Cómo debo modificar mi PATHpara que esto funcione? Estoy usando el caparazón de pescado, pero estaré encantado de trasladar una solución de cualquier otro caparazón al mío.

Respuesta1

Entiendo que no estás contento con solo

PATH="./mybin:../mybin:../../mybin:../../../mybin:$PATH"

hasta algún límite como aproximadamente 8 subdirectorios.

En lugar de contaminar y interrumpir su búsqueda de comandos habitual, le sugiero que utilice un contenedor corto, de modo que la búsqueda recursiva solo se realice para los comandos que tienen el prefijo.

P.ej. k fooLo intentaré ./mybin/foo, ../mybin/fooetc., pero simplemente foolo buscaremos en $PATH, como de costumbre.

Pero no estoy usando pescado y no tengo idea de cómo podría escribirse eso en el lenguaje de la concha del pescado. Con bash/ksh/zsh, podría ser algo como:

function k {
    typeset p=. cmd=$1; shift
    while
        typeset e=$p/mybin/$cmd
        if [ -x "$e" ]; then "$e" "$@"; return; fi 
        [ ! "$p" -ef / ]
    do
        p=../$p
    done
    echo >&2 "k: not found: $cmd"; return 1
}

Si eso funciona, podrías convertirlo en un script ejecutable independiente, en lugar de intentar traducirlo a fish:

#! /bin/bash
p=. cmd=$1; shift
while
    e=$p/mybin/$cmd
    if [ -x "$e" ]; then exec "$e" "$@"; fi
    [ ! "$p" -ef / ]
do
    p=../$p
done
echo >&2 "k: not found: $cmd"; exit 1

información relacionada