È possibile aggiungere tutte le sottodirectory quando si aggiunge una directory a $ PATH


8

Quando si aggiunge una directory a $ PATH con PATH = ~ / my_program / bin: ”$ {PATH}”

  1. è vero che solo gli eseguibili direttamente nella directory verranno trovati tramite $ PATH, ma non gli altri eseguibili nei suoi sottodirectory?
  2. è possibile aggiungere tutte le sue sottodirectory? A volte specificare esplicitamente tutte le sottodirectory può essere molto impegnativo quando ce ne sono molte.

Grazie e saluti!

Risposte:


5

Questo script utilizza tree...

  • sudo apt-get install tree

Puoi cambiare la profondità delle directory cambiando -L 1
e puoi scegliere se usare o meno ~/...

AGGIORNAMENTO 2 :
.. modificato lo script per sostituire solo un comando / home / user / (non "any")
.. e aggiunto args ..

AGGIORNAMENTO Controllo aggiunto: .. Non aggiungere la directory a PATH quando è già in PATH .. Questo controllo considera '~ /' e '/ home / user /' diversi.

Per quanto riguarda la tua domanda 1 ... sì, è vero; ogni directory specifica deve essere velocizzata individualmente nel PERCORSO ..

Per quanto riguarda la tua domanda 2 ... Ecco uno script che farà ciò che vuoi ..
L'ho testato, ma così com'è renderà il nuovo PERCORSO per la sessione corrente ..
Per renderlo permanente puoi usare export PATH(ma Sono un po 'impreciso sui dettagli di 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

3

Non è possibile, perché i sistemi basati su UNIX non sono progettati per funzionare in questo modo. In genere, tutti i file eseguibili vanno in una delle poche directory. Ad esempio, tutte le cose che scrivo per i miei scopi vanno in ~ / bin.

Se non si desidera che i binari e gli script effettivi vivano in una directory bin, è possibile creare un collegamento simbolico, ad esempio ~ / bin al binario effettivo.

Avere tutte le sottodirectory in $ PATH non è particolarmente desiderabile, dal momento che aggiunge solo più directory alla ricerca, aumenta il rischio che altri eseguibili entrino nel tuo PATH che non dovrebbero essere lì, e non offre davvero molti vantaggi.


3

Questo dovrebbe fare il lavoro

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

Ti preghiamo di tenerne conto

  • L'intero albero delle directory verrà attraversato, il che può richiedere del tempo, quindi cerca di mantenere piccola la gerarchia.
  • Questo non terrà conto delle directory create dopo aver impostato il PERCORSO.
  • Se lo invochi più volte, ci saranno molti duplicati nel PERCORSO. Potresti voler assegnare il PATH originale a qualche variabile temporanea (es. OLD_PATH).

Due bug: non aggiunge percorsi assoluti -> non funziona correttamente. Inoltre, aggiunge due doppi punti. Rimuovi: dopo $ PATH.
Olli,

1

No, non è possibile in modo semplice. Sarebbe possibile aggiungere softlink a tutti gli eseguibili in "~ / my_program / bin"?


1

Provalo in questo modo:

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

Questo si aggiungerà ~/.local/bina tutte le sue sottodirectory in $PATH.

Spiegazione:

  • du visualizzerà tutte le informazioni sulle sottodirectory ogni riga
  • cut -f2 estrarrà la seconda colonna, ovvero i nomi delle sottodirectory
  • tr '\n' ':'cambierà ogni interruzione di collegamento in due punti. Ciò unirà tutte le linee in un'unica linea e le sottodirectory sono delimitate da due punti
  • sed 's/:*$//' rimuoverà gli ultimi due punti
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.