
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
cmd1
ycmd2
están disponibles enP1/S1
.- sólo
cmd1
está disponible enP1
oP1/S2
. - ninguno está disponible en
P2
oP2/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 PATH
para 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 foo
Lo intentaré ./mybin/foo
, ../mybin/foo
etc., pero simplemente foo
lo 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