Dimungkinkan untuk menambahkan semua subdirektori saat menambahkan direktori ke $ PATH

8

Ketika menambahkan beberapa direktori ke $ PATH oleh PATH = ~ / my_program / bin: "$ {PATH}"

  1. apakah benar bahwa hanya executable yang berada di bawah direktori akan ditemukan melalui $ PATH, tetapi executable lain di bawah subdirectornya tidak akan?
  2. apakah mungkin membuat semua subdirektori ditambahkan? Kadang-kadang menentukan semua subdirektori secara eksplisit bisa menjadi banyak pekerjaan ketika ada banyak.

Terima kasih dan salam!

Tim
sumber

Jawaban:

5

Script ini menggunakan tree...

  • sudo apt-get install tree

Anda dapat mengubah kedalaman direktori dengan mengubah -L 1
dan Anda dapat memilih ~/...

UPDATE 2 :
.. memodifikasi skrip untuk mengganti hanya yang terdepan / home / user / (bukan "any")
.. dan menambahkan argumen ..

UPDATE Menambahkan cek: .. Jangan menambahkan direktori ke PATH ketika sudah di PATH .. Pemeriksaan ini menganggap '~ /' dan '/ home / user /' berbeda.

Jawab pertanyaan Anda 1 ... ya itu benar; setiap direktori spesifik harus ditentukan secara terpisah di PATH ..

Re pertanyaan Anda 2 ... Berikut ini adalah skrip yang akan melakukan apa yang Anda inginkan ..
Saya sudah mengujinya, tetapi seperti berdiri itu akan membuat PATH baru untuk sesi saat ini ..
Untuk membuatnya permanen Anda dapat menggunakan export PATH(tetapi Saya agak kurang jelas tentang detail 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
sumber
3

Itu tidak mungkin, karena sistem berbasis UNIX tidak dirancang untuk bekerja seperti itu. Biasanya, semua file yang dapat dieksekusi masuk ke salah satu dari sejumlah kecil direktori. Sebagai contoh, semua hal yang saya tulis untuk keperluan saya sendiri masuk ~ / bin.

Jika Anda tidak ingin binari dan skrip Anda yang sebenarnya tinggal di direktori bin, Anda dapat membuat symlink di, misalnya, ~ / bin ke biner yang sebenarnya.

Memiliki semua subdirektori dalam $ PATH tidak terlalu diinginkan, karena hanya menambah lebih banyak direktori untuk dicari, meningkatkan risiko executable lain masuk ke PATH Anda yang seharusnya tidak ada, dan tidak benar-benar memberikan banyak manfaat.

Scott Severance
sumber
3

Ini harus melakukan pekerjaan

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

Tolong pertimbangkan itu

  • Keseluruhan pohon direktori akan dilalui, yang dapat memakan waktu, jadi cobalah untuk menjaga hierarki tetap kecil.
  • Ini tidak akan mempertimbangkan direktori akun yang dibuat setelah PATH diatur.
  • Jika Anda menjalankan ini beberapa kali, akan ada banyak duplikat di PATH. Anda mungkin ingin menetapkan PATH asli ke beberapa variabel sementara (mis. OLD_PATH).
Adam Byrtek
sumber
Dua bug: tidak menambahkan jalur absolut -> tidak berfungsi dengan benar. Juga, ia menambahkan dua titik dua. Hapus: setelah $ PATH.
Olli
1

Tidak, itu tidak mungkin dengan cara yang mudah. Apakah mungkin untuk menambahkan softlink ke semua file executable ke "~ / my_program / bin"?

ddeimeke
sumber
1

Coba dengan cara ini:

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

Ini akan menambahkan ~/.local/bindirinya bersama dengan semua subdirektori ke $PATH.

Penjelasan:

  • du akan menampilkan semua info subdirektori setiap baris
  • cut -f2 akan mengekstrak kolom kedua, yaitu nama-nama subdirektori
  • tr '\n' ':'akan mengubah setiap tautan yang dipecah menjadi titik dua. Ini akan menggabungkan semua baris menjadi satu baris dan subdirektori dibatasi oleh titik dua
  • sed 's/:*$//' akan menghapus usus besar terakhir
R0ckyY2
sumber