•10 min read

Cách thêm thư mục vào PATH trong Linux (Khắc phục vĩnh viễn)

Cách thêm thư mục vào PATH trong Linux (Khắc phục vĩnh viễn)

Bạn đã cài đặt một công cụ, chạy nó và nhận được command not found. Bạn biết tệp nhị phân đó nằm đâu đó trên hệ thống của mình. Bạn có thể thấy nó ngay đó khi chạy ls /home/user/.local/bin/my-tool. Nhưng terminal của bạn không nhận ra nó.

Điều này đã xảy ra với tôi ít nhất ba lần trước khi tôi thực sự hiểu chuyện gì đang diễn ra. Cách khắc phục là thêm thư mục đó vào biến môi trường PATH của bạn.

Audio Briefing
0:00 / 0:00
Part of a Series

Modern Linux & Terminal Mastery Series

Part 1 of 4

PATH thực sự hoạt động như thế nào

Khi bạn gõ my-tool vào terminal, shell của bạn không tìm kiếm toàn bộ hệ thống tệp. Nó chỉ kiểm tra các thư mục được liệt kê trong biến PATH, từng cái một, theo thứ tự. Ngay khi tìm thấy một kết quả khớp, nó sẽ dừng tìm kiếm.

Đây là một PATH điển hình trông như thế nào:

/home/user/.local/bin:/usr/local/bin:/usr/bin:/bin

Những dấu hai chấm đó là các dấu phân cách. Vì vậy, shell bắt đầu bằng cách tìm kiếm trong /home/user/.local/bin, sau đó /usr/local/bin, sau đó /usr/bin, và cuối cùng /bin. Nếu công cụ của bạn nằm trong /home/user/.local/bin và thư mục đó không có trong danh sách, shell sẽ không bao giờ tìm thấy nó.

Nghe quen không?

Để xem PATH hiện tại của bạn, hãy chạy:

echo $PATH

Đầu ra đó là một chuỗi được phân tách bằng dấu hai chấm. Thành thật mà nói, không dễ đọc lắm.

Để kiểm tra một lệnh cụ thể thực sự đến từ đâu:

which <command>

Điều này cho bạn biết shell của bạn giải quyết tệp thực thi nào, và nó thực sự tìm thấy nó trong thư mục nào.

Advertisement

Thêm một thư mục vĩnh viễn

Đây là nơi mọi người bị lạc. Có những thay đổi PATH tạm thời và những thay đổi PATH vĩnh viễn. Tôi đã nhầm lẫn chúng quá lâu.

Tạm thời có nghĩa là chạy export PATH="$PATH:/home/user/.local/bin" trực tiếp trong terminal của bạn. Nó hoạt động ngay lúc đó. Sau đó, bạn đóng terminal đó, mở một cái mới, và không có gì thay đổi.

Vĩnh viễn có nghĩa là chỉnh sửa tệp cấu hình shell của bạn để thay đổi tồn tại sau khi khởi động lại.

Tệp cần chỉnh sửa phụ thuộc vào shell bạn đang sử dụng.

Bash

Chỉnh sửa ~/.bashrc trên Linux, hoặc ~/.bash_profile nếu bạn đang dùng macOS. Thêm dòng này:

export PATH="$PATH:/home/user/.local/bin"

Lưu tệp, sau đó tải lại bằng:

source ~/.bashrc

Hoặc chỉ cần mở một cửa sổ terminal mới. Cách đó cũng được.

Zsh

Chỉnh sửa ~/.zshrc. Dòng này giống hệt:

export PATH="$PATH:/home/user/.local/bin"

Tải lại bằng:

source ~/.zshrc

Fish

Fish thì khác. Nó không sử dụng cú pháp export. Thay vào đó, bạn chỉnh sửa ~/.config/fish/config.fish và thêm:

fish_add_path /home/user/.local/bin

Đây là lý do tại sao tôi thực sự thích Fish cho việc này: nó tự động ngăn chặn các mục trùng lặp. Và nó thêm đường dẫn vào đầu PATH theo mặc định, có nghĩa là thư mục mới của bạn được ưu tiên. Điều đó tiện lợi khi bạn muốn công cụ được cài đặt cục bộ của mình thắng thế so với phiên bản hệ thống.

Mẹo 'export' đó chỉ hoạt động trong phiên đó

Tôi đã học được điều này một cách khó khăn. Tôi sẽ chạy export PATH="/some/path:$PATH" trong terminal của mình, phấn khích vì nó hoạt động, đóng cửa sổ, và tự hỏi tại sao mọi thứ lại được đặt lại. Nếu nó không có trong tệp cấu hình của bạn, nó sẽ không tồn tại. Luôn luôn.

Những sai lầm khiến tôi liên tục vấp ngã

Sau khi giúp một vài người gỡ lỗi các vấn đề về PATH của họ, tôi nhận thấy những vấn đề tương tự xuất hiện lặp đi lặp lại.

Chương trình sai được sử dụng

Bạn đã bao giờ cài đặt một cái gì đó và tự hỏi tại sao phiên bản cũ vẫn chạy chưa? Hai thư mục có thể đều có một chương trình cùng tên. Cái được liệt kê đầu tiên trong PATH của bạn sẽ thắng, mọi lúc. Chạy which <command> và kiểm tra đường dẫn. Nó có phải là cái bạn mong đợi không?

Nếu không, bạn có một bản sao đang ẩn đâu đó.

Quyền chặn mọi thứ

Điều này rõ ràng khi nhìn lại, nhưng tôi đã mất một thời gian dài đáng xấu hổ để gỡ lỗi. Thư mục cần phải có thể đọc được, và tệp cần có quyền thực thi. Nếu một trong hai sai, shell của bạn sẽ hoạt động như thể lệnh không tồn tại.

Cách khắc phục rất đơn giản:

chmod +x /path/to/file

Dấu ngoặc kép giúp giữ tỉnh táo

Luôn đặt dấu ngoặc kép cho các gán PATH của bạn. Cái này hoạt động:

export PATH="$PATH:/home/user/.local/bin"

Cái này bị lỗi một cách âm thầm khi đường dẫn có khoảng trắng:

export PATH=$PATH:/home/user/.local/bin

Không có thông báo lỗi. Chỉ là một PATH bị hỏng. Dấu ngoặc kép chỉ tốn của bạn hai ký tự. Hãy sử dụng chúng.

Các mục trùng lặp chất đống

Nếu bạn cứ thêm các dòng export vào nhiều tệp cấu hình, hoặc nếu bạn nguồn cấu hình của mình nhiều lần, bạn sẽ có cùng một thư mục được liệt kê hai, ba, thậm chí năm lần trong PATH của bạn. Nó không nguy hiểm, nhưng nó lộn xộn.

Để tìm các mục trùng lặp trong shell hiện tại của bạn:

echo $PATH | tr ':' '\n' | sort | uniq -d

fish_add_path của Fish xử lý điều này tự động. Người dùng Bash và Zsh cần cẩn thận hơn.

Quy trình từng bước thực sự hiệu quả

Hãy để tôi hướng dẫn bạn qua quy trình tôi sử dụng bây giờ khi tôi gặp vấn đề này.

Tìm nơi tệp nhị phân thực sự nằm

Nếu bạn biết đường dẫn chính xác, tuyệt vời. Nếu không, hãy tìm kiếm nó bằng find ~ -name "my-tool" -type f 2>/dev/null. Lệnh đó tìm kiếm trong thư mục chính của bạn các tệp có tên "my-tool".

Kiểm tra xem nó đã có trong PATH chưa

Chạy echo $PATH | tr ':' '\n' | grep -x "/path/you/found". Cờ -x có nghĩa là "khớp chính xác dòng". Nếu không có gì xuất hiện, nó chưa có ở đó.

Thêm nó vào cấu hình shell của bạn

Mở tệp phù hợp cho shell của bạn (kiểm tra bằng echo $SHELL). Thêm dòng thích hợp. Đối với bash/zsh: export PATH="$PATH:/path/you/found". Đối với fish: fish_add_path /path/you/found.

Tải lại và xác minh

Chạy source ~/.bashrc (hoặc lệnh tương đương của bạn). Sau đó chạy which my-tool và xác nhận nó trỏ đến đúng vị trí.

Advertisement

Khi Fish chỉ cảm thấy đúng

Tôi bắt đầu sử dụng Fish vài năm trước, chủ yếu vì cách nó xử lý PATH. Lệnh tích hợp fish_add_path thực hiện chính xác những gì bạn mong đợi, không bao giờ thêm các mục trùng lặp và đưa ra cảnh báo rõ ràng nếu bạn cố gắng thêm một cái gì đó không tồn tại.

Có đáng để chuyển đổi shell chỉ vì điều này không? Cũng có thể. Các tính năng cải thiện chất lượng cuộc sống khác đã giữ tôi ở lại. Nhưng nếu bạn hài lòng với bash hoặc zsh, bạn không cần phải chuyển đổi. Chỉ cần cẩn thận hơn với các tệp cấu hình của bạn.

Mô hình tư duy đã giúp tôi hiểu ra

Hãy nghĩ về PATH như một chuỗi các điểm kiểm tra. Khi bạn gõ một lệnh, shell của bạn sẽ đi xuống danh sách, kiểm tra từng điểm kiểm tra theo thứ tự. Điểm dừng đầu tiên: /home/user/.local/bin. Điểm dừng thứ hai: /usr/local/bin. Điểm dừng thứ ba: /usr/bin. Điểm kiểm tra đầu tiên có tệp thực thi bạn muốn là cái được sử dụng.

Không có gì xảy ra song song. Không có gì tìm kiếm toàn bộ tòa nhà. Chỉ là một cuộc đi bộ tuần tự xuống một danh sách.

Một khi điều đó đã rõ ràng, mọi thứ về PATH đều có ý nghĩa đối với tôi.

Thứ tự PATH quan trọng hơn bạn nghĩ

Khi hai chương trình có cùng tên, chương trình trong thư mục PATH sớm hơn sẽ thắng. Bạn muốn phiên bản được cài đặt cục bộ của mình chạy thay vì phiên bản hệ thống? Đặt thư mục của bạn lên đầu PATH. Bạn muốn phiên bản hệ thống là mặc định? Đặt nó ở cuối, hoặc không thêm thư mục cục bộ của bạn chút nào.

Tham khảo nhanh

ShellTệp cấu hìnhLệnh
Bash~/.bashrcexport PATH="$PATH:/new/path"
Zsh~/.zshrcexport PATH="$PATH:/new/path"
Fish~/.config/fish/config.fishfish_add_path /new/path

Tổng kết

Sự nhầm lẫn về PATH là một trong những vấn đề cảm thấy bí ẩn cho đến khi bạn hiểu ra. Một khi bạn hiểu phép ẩn dụ về điểm kiểm tra, mọi thứ khác sẽ vào đúng vị trí.

Mở ~/.bashrc (đối với Bash) hoặc ~/.zshrc (đối với Zsh) trong trình soạn thảo văn bản, thêm export PATH="$PATH:/your/directory/path" vào cuối tệp, lưu và chạy source ~/.bashrc để tải lại phiên terminal của bạn.

Chạy export PATH=... trực tiếp trong dòng lệnh chỉ đặt biến cho tiến trình shell hiện tại. Để làm cho nó tồn tại trên tất cả các cửa sổ terminal trong tương lai, bạn phải thêm dòng export vào tệp cấu hình shell của mình (~/.bashrc hoặc ~/.zshrc).

Thêm vào đầu (export PATH="/custom/bin:$PATH") nếu bạn muốn tệp nhị phân tùy chỉnh của mình ghi đè lên các phiên bản hệ thống của cùng một công cụ. Thêm vào cuối (export PATH="$PATH:/custom/bin") nếu bạn muốn các tệp nhị phân hệ thống duy trì quyền ưu tiên thực thi.


Bạn cũng có thể thích

Share this article:

Stay Updated

Get the latest posts delivered straight to your inbox.

Free Developer Utilities

Free In-Browser Developer Tools

Clean AI CLI logs, build cron expressions, decode JWTs, and calculate chmod permissions offline.

Explore Tools
Advertisement