Có thể thêm tất cả các thư mục con khi thêm thư mục vào $ PATH


8

Khi thêm một số thư mục vào $ PATH bởi PATH = ~ / my_program / bin: xông $ {PATH} '

  1. có đúng là chỉ các tệp thực thi trực tiếp trong thư mục sẽ được tìm thấy thông qua $ PATH, nhưng các tệp thực thi khác trong thư mục con của nó sẽ không?
  2. có thể làm cho tất cả các thư mục con của nó được thêm vào? Đôi khi chỉ định tất cả các thư mục con rõ ràng có thể là rất nhiều công việc khi có nhiều.

Cảm ơn và trân trọng!

Câu trả lời:


5

Kịch bản này sử dụng tree...

  • sudo apt-get install tree

Bạn có thể thay đổi độ sâu của thư mục bằng cách thay đổi -L 1
và bạn có thể chọn sử dụng hay không ~/...

CẬP NHẬT 2 :
.. đã sửa đổi tập lệnh để chỉ thay thế hàng đầu / nhà / người dùng / (không phải "bất kỳ")
.. và thêm args ..

CẬP NHẬT Đã thêm kiểm tra: .. Đừng thêm thư mục vào PATH khi nó đã có trong PATH .. Kiểm tra này coi '~ /' và '/ home / user /' là khác nhau.

Re câu hỏi của bạn 1 ... vâng nó là sự thật; mỗi thư mục cụ thể phải được tăng tốc riêng lẻ trong PATH ..

Trả lời câu hỏi của bạn 2 ... Đây là một kịch bản sẽ làm những gì bạn muốn ..
Tôi đã thử nó, nhưng vì nó sẽ tạo ra PATH mới cho phiên hiện tại ..
Để làm cho nó vĩnh viễn bạn có thể sử dụng export PATH(nhưng Tôi hơi sơ sài về các chi tiết của 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

Không thể, bởi vì các hệ thống dựa trên UNIX không được thiết kế để hoạt động như vậy. Thông thường, tất cả các tệp thực thi đi vào một trong một số ít thư mục. Ví dụ: tất cả nội dung mà tôi viết cho mục đích riêng của mình đều có trong ~ / bin.

Nếu bạn không muốn các tệp nhị phân và tập lệnh thực sự của mình nằm trong thư mục bin, bạn có thể tạo một liên kết tượng trưng, ​​ví dụ: ~ / bin cho tệp nhị phân thực.

Có tất cả các thư mục con trong $ PATH không đặc biệt mong muốn, vì nó chỉ cần thêm nhiều thư mục để tìm kiếm, làm tăng nguy cơ các thực thi khác nhận được trong PATH của bạn không nên ở đó và không thực sự mang lại nhiều lợi ích.


3

Điều này nên làm công việc

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

Hãy tính đến điều đó

  • Toàn bộ cây thư mục sẽ được duyệt qua, có thể mất một chút thời gian, vì vậy hãy cố gắng giữ cấu trúc phân cấp nhỏ.
  • Điều này sẽ không đưa vào các thư mục tài khoản được tạo sau khi PATH được đặt.
  • Nếu bạn gọi điều này nhiều lần, sẽ có rất nhiều bản sao trong PATH. Bạn có thể muốn gán PATH gốc cho một số biến tạm thời (ví dụ: OLD_PATH).

Hai lỗi: không thêm đường dẫn tuyệt đối -> không hoạt động đúng. Ngoài ra, nó thêm hai dấu hai chấm. Xóa: sau $ PATH.
Olli

1

Không, nó không thể một cách dễ dàng. Có thể thêm các liên kết mềm vào tất cả các tệp thực thi vào "~ / my_program / bin" không?


1

Hãy thử nó theo cách này:

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

Điều này sẽ thêm ~/.local/binchính nó cùng với tất cả các thư mục con của nó vào $PATH.

Giải trình:

  • du sẽ hiển thị tất cả các thông tin thư mục con mỗi dòng
  • cut -f2 sẽ trích xuất cột thứ hai, tức là tên của các thư mục con
  • tr '\n' ':'sẽ thay đổi mỗi liên kết phá vỡ thành một dấu hai chấm. Điều này sẽ nối tất cả các dòng thành một dòng duy nhất và các thư mục con được phân cách bằng dấu hai chấm
  • sed 's/:*$//' sẽ loại bỏ dấu hai chấm cuối cùng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.