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_profilecó nguồn gốc, theo sau ~/.profilevà ~/.bashrc. Chỉ trong ~/.profiletô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 ~/.profilenguồ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 PATHbiế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
~/.profilevà 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 echotrong 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 .bashrctậ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ì PATHnên bắt đầu với. Kiểm tra PATHtrước để quyết định.
~/.profilevà ~/.bashrctừ~/.bash_profile
~/.profilenếu~/.bash_profilekhông tồn tại ...