Posible agregar todos los subdirectorios al agregar un directorio a $ PATH

8

Al agregar algún directorio a $ PATH por PATH = ~ / my_program / bin: "$ {PATH}"

  1. ¿Es cierto que solo los ejecutables directamente bajo el directorio se encontrarán a través de $ PATH, pero otros ejecutables bajo sus subdirectores no?
  2. ¿Es posible agregar todos sus subdirectorios? A veces, especificar todos los subdirectorios explícitamente puede ser mucho trabajo cuando hay muchos.

¡Gracias y saludos!

Tim
fuente

Respuestas:

5

Este script usa tree...

  • sudo apt-get install tree

Puede cambiar la profundidad de los directorios cambiando -L 1
y puede elegir si desea usar o no ~/...

ACTUALIZACIÓN 2 :
.. modificó la secuencia de comandos para reemplazar sólo un líder / home / usuario / (no "cualquier")
.. y args añadido ..

ACTUALIZACIÓN Comprobación agregada: .. No agregue el directorio a PATH cuando ya está en PATH. Esta comprobación considera que '~ /' y '/ home / user /' son diferentes.

Re su pregunta 1 ... sí, es verdad; cada directorio específico se debe especializar individualmente en la RUTA.

Vuelve a tu pregunta 2 ... Aquí hay un script que hará lo que quieras ...
Lo he probado, pero tal como está, creará la nueva RUTA para la sesión actual ...
Para que sea permanente, puedes usar export PATH(pero Soy un poco vago en los detalles de export)

#
# name: path-add-dirs
# eg: $ path-add-dirs "$HOME/bin" "tilde" 1

# When directories are $HOME based, choose format.
# Add directories in tidle format: ~/...
#       ...or as fullly-qualified: /home/user/...

# mode values: "tilde", or  anything else for fully-qualified   
mode="$2" # valid mode values: "tilde", or  anything else   
maindir="$1"; dirs= ; echo
# Buld string of subdirectories to a depth/level of 1  
while IFS= read -r dir ; do
  # Don't add directory if it is already in PATH
  if [[ "$mode" == "tilde" ]] ; then
    # replace only a *leading* :/home/user/ 
    homecheck=":$dir"                    
    dircheck="${homecheck/:$HOME\//:~/}"
    dircheck="${dircheck#:}"
  else
    dircheck="${dir}"
  fi;
  pathcheck=":$PATH:"
  if [[ "$pathcheck" != "${pathcheck/:$dircheck:/}" ]] ; then  
    echo "ALREADY IN PATH: $dircheck"
  else
    dirs="$dirs:$dir"  
    echo " added: $dircheck"
  fi
done < <(tree --noreport -L $3 -fi -d "$maindir")
# Choose one of these two options
if [[ "$mode" == "tilde" ]] 
then PATH="$PATH${dirs//:$HOME\//:~/}" # change :$HOME to :~/ 
else PATH="$PATH$dirs" # this method has fully expanded $HOME
fi
echo
echo "$PATH"
echo
Peter.O
fuente
3

No es posible, porque los sistemas basados ​​en UNIX no están diseñados para funcionar así. Por lo general, todos los archivos ejecutables van en uno de un pequeño número de directorios. Por ejemplo, todo lo que escribo para mis propios fines va en ~ / bin.

Si no desea que sus binarios y scripts reales vivan en un directorio bin, puede crear un enlace simbólico en, por ejemplo, ~ / bin al binario real.

Tener todos los subdirectorios en $ PATH no es particularmente deseable, ya que solo agrega más directorios para buscar, aumenta el riesgo de que otros ejecutables ingresen a su PATH que no deberían estar allí, y realmente no brinda mucho beneficio.

Scott Cesantía
fuente
3

Esto debería hacer el trabajo

PATH="$PATH:$(find ~/bin -type d -printf ":%p")"

Por favor tenga en cuenta que

  • Se recorrerá todo el árbol de directorios, lo que puede llevar algo de tiempo, así que trate de mantener la jerarquía pequeña.
  • Esto no tendrá en cuenta los directorios creados después de establecer la RUTA.
  • Si invocas esto varias veces, obtendrás muchos duplicados en la RUTA. Es posible que desee asignar la RUTA original a alguna variable temporal (por ejemplo, OLD_PATH).
Adam Byrtek
fuente
Dos errores: no está agregando rutas absolutas -> no funciona correctamente. Además, agrega dos puntos dobles. Eliminar: después de $ PATH.
Olli
1

No, no es posible de una manera fácil. ¿Sería posible agregar enlaces suaves a todos los ejecutables a "~ / my_program / bin"?

ddeimeke
fuente
1

Pruébalo de esta manera:

export PATH="$PATH:$(du "$HOME/.local/bin/" | cut -f2 | tr '\n' ':' | sed 's/:*$//')"

Esto se agregará ~/.local/binjunto con todos sus subdirectorios en $PATH.

Explicación:

  • du mostrará toda la información de subdirectorios en cada línea
  • cut -f2 extraerá la segunda columna, es decir, los nombres de los subdirectorios
  • tr '\n' ':'cambiará cada salto de enlace en dos puntos. Esto unirá todas las líneas en una sola línea y los subdirectorios están delimitados por dos puntos
  • sed 's/:*$//' eliminará el último colon
R0ckyY2
fuente