Sau khi bắt đầu một bash terminal, tôi nhận thấy rằng biến PATH chứa các mục trùng lặp. Thiết bị đầu cuối của tôi bắt đầu một vỏ đăng nhập , do đó ~/.bash_profile
có nguồn gốc, theo sau ~/.profile
và ~/.bashrc
. Chỉ trong ~/.profile
tôi mới tạo các mục đường dẫn được nhân đôi.
Để được mô tả, đây là thứ tự các tệp NÊN có nguồn gốc đang được lấy nguồn:
Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc
Trước khi bất kỳ ai đánh dấu đây là một bản sao của "biến PATH chứa các bản sao", hãy tiếp tục đọc.
Lúc đầu, tôi nghĩ rằng điều này phải làm với ~/.profile
nguồn gốc hai lần, vì vậy tôi đã ghi tệp vào tệp nhật ký bất cứ khi nào nó có nguồn gốc, và đáng ngạc nhiên là nó chỉ đăng nhập một mục, cho tôi biết rằng nó chỉ có nguồn gốc một lần. Đáng ngạc nhiên hơn nữa là khi tôi nhận xét các mục trong đó ~/.profile
, các mục vẫn xuất hiện trong PATH
biến. Điều này đã đưa tôi đến ba kết luận, một trong số đó nhanh chóng bị loại trừ:
- Bash bỏ qua các bình luận bash hợp lệ và vẫn thực thi mã nhận xét
- Có một đoạn script đọc
~/.profile
và bỏ qua bất kỳ mã nào in ra một đầu ra (ví dụ tệp nhật ký) - Có một bản sao khác của tôi
~/.profile
đang được cung cấp ở nơi khác
Điều đầu tiên, tôi nhanh chóng kết luận không phải là trường hợp do một số thử nghiệm nhanh. Các tùy chọn thứ hai và thứ ba là nơi tôi cần giúp đỡ.
Làm cách nào để thu thập nhật ký các tập lệnh được thực thi khi thiết bị đầu cuối của tôi khởi động? Tôi đã sử dụng echo
trong các tệp mà tôi đã kiểm tra để biết liệu chúng có nguồn gốc từ bash hay không, nhưng tôi cần tìm một phương thức kết luận theo dõi việc thực thi đến điểm khi thiết bị đầu cuối sẵn sàng để tôi bắt đầu nhập vào nó.
Nếu những điều trên là không thể, thì bất cứ ai cũng có thể đề nghị nơi nào khác tôi có thể xem để xem tập lệnh nào đang được chạy .
Tài liệu tham khảo trong tương lai
Đây là tập lệnh mà tôi hiện đang sử dụng để thêm vào đường dẫn của mình:
function add_to_path() {
for path in ${2//:/ }; do
if ! [[ "${!1}" =~ "${path%/}" ]]; then # ignore last /
new_path="$path:${!1#:}"
export "$1"="${new_path%:}" # remove trailing :
fi
done
}
Tôi sử dụng nó như thế này:
add_to_path 'PATH' "/some/path/bin"
Kịch bản kiểm tra nếu đường dẫn đã tồn tại trong biến trước khi thêm nó.
Đối với người dùng zsh, bạn có thể sử dụng tương đương này:
function add_to_path() {
for p in ${(s.:.)2}; do
if [[ ! "${(P)1}" =~ "${p%/}" ]]; then
new_path="$p:${(P)1#:}"
export "$1"="${new_path%:}"
fi
done
}
Chỉnh sửa 28/8/2018
Một điều nữa tôi thấy tôi có thể làm với kịch bản này là sửa lỗi đường dẫn. Vì vậy, khi bắt đầu .bashrc
tập tin của tôi , tôi làm một cái gì đó như thế này:
_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path
Nó là tùy thuộc vào bạn những gì PATH
nên bắt đầu với. Kiểm tra PATH
trước để quyết định.
~/.profile
và ~/.bashrc
từ~/.bash_profile
~/.profile
nếu~/.bash_profile
không tồn tại ...