Linux - @PATH để làm gì?
TIL
500
Linux
77
path
1
@100daysTIL
43
White

ngminhtrung viết ngày 27/01/2018

Linux - @PATH để làm gì?

Ghi chú: Series Today I Learn trong vòng 100 ngày thử thách bản thân - ngày 04. Mỗi ngày 1 câu hỏi, 1 câu trả lời (ngắn nhất có thể). Mời cả nhà cũng tham gia. Tag đề nghị: #100daysTIL

Từ lúc đụng vào Linux, đi đâu cũng thấy $PATH. Vừa cài chương trình tên jrnl vào máy, mà gõ báo lỗi command not found, người ta hướng dẫn là phải kiểm tra và thay đổi $PATH. Thôi đành mất công tìm hiểu chút để thoát khỏi cảnh cứ copy lệnh của người khác mà chẳng hiểu gì.

Lưu ý: Các lệnh bên dưới được thực hiện trên máy dùng shell fish.

$PATH là gì?

Để trả lời cho câu hỏi này, hãy tưởng tượng mỗi lần ta gõ 1 lệnh nào đó, ví dụ ls chẳng hạn (viết tắt của l i s t, dùng để in danh sách folder), thì hệ điều hành sẽ tìm file thực thi (binary) của chương trình mang tên ls ở đâu? Nếu gõ thẳng ra là /bin/ls thì chẳng nói, vì lúc đó ta đã bảo trực tiếp cho hệ điều hành sộc vào folder /bin là sẽ thấy ls. Còn không nói cụ thể, thì chẳng nhẽ sẽ tìm ở toàn bộ các folder trên máy? Lúc này đây ta cần lưu lại đường dẫn đến các chương trình ở 1 nơi nào đó để hệ điều hành biết mà giới hạn chỗ đi tìm. Biến $PATH chính là nơi để lưu lại đường dẫn trên, mà không chỉ một, mà có thể có nhiều đường dẫn, bởi người dùng có thể chứa chương trình ở nhiều folder khác nhau.

Lưu ý: $PATH, không phải $path, hay $Path.

Muốn xem $PATH chứa gì phải làm sao?

Muốn biết xem có những đường dẫn nào lưu trong $PATH của máy mình, gõ lệnh sau trong terminal

echo $PATH

kết quả sẽ tương tự như sau

/home/tên-account-của-bạn/bin /home/tên-account-của-bạn/.local/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games

Lưu ý: Không giống các shell khác, trong fish, $PATH là một danh sách với đường dẫn ngăn cách nhau bởi dấu cách , không phải dấu dấu hai chấm :.

Nhưng trông khó nhìn nhể? Muốn cho thông tin hiện ra dễ đọc hơn, có thể thử với printf "%s\n" $PATH. Lệnh printf giúp hiện text trong $PATH theo format quy định bởi người dùng, ở đây là "%s\n", trong đó %s ký hiệu thay cho string, còn \n báo printf xuống dòng sau mỗi kết quả. Ta đạt được là:

/home/tên-account-của-bạn/bin
/home/tên-account-của-bạn/.local/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games

Lưu ý: Còn nhiều lệnh khác cho kết quả tương tự.

Các đường dẫn trên có bình đẳng không?

Dù là anh em trong 1 nhà, nhưng mấy bạn đường dẫn trong $PATH không bình đẳng. Bạn nào ở trên (hoặc ngoài cùng bên trái) sẽ được ưu tiên tìm trước, bạn nào ở dưới (hoặc phía bên phải) tìm sau. Một khi Linux đã tìm được chương trình nó cần, nó sẽ dừng việc tìm kiếm trong các đường dẫn phía sau. Tức là có thể có 2 files thực thi cùng tên lưu ở 2 nơi, thì Linux chỉ chạy file đầu tiên mà nó tìm thấy.

Muốn thay đổi $PATH thì cần làm gì?

Đối với shell fish, ta có các lựa chọn sau:

  1. Chèn tạm thời đường dẫn /usr/local/bin và đường dẫn /usr/sbin
  2. lên đầu $PATH, gõ: set PATH /usr/local/bin /usr/sbin $PATH
  3. xuống cuối $PATH, gõ: set PATH $PATH /usr/local/bin /usr/sbin

Lưu ý: Tạm thời ở đây có nghĩa là thiết lập sẽ bị mất sau khi logout. Việc này hữu ích nếu chỉ muốn test mà không làm ảnh hưởng đến hệ thống lâu dài.

  1. Chèn vĩnh viễn:
  2. lên đầu: set -U fish_user_paths /usr/local/bin $fish_user_paths
  3. xuống cuối:

    set -U fish_user_paths $fish_user_paths /usr/local/bin
    

    trong đó $fish_user_pathsuniversal variable mà giá trị của nó được chia sẻ mọi lúc mọi nơi trong fish.

  4. Xóa đường dẫn /usr/local/bin khỏi $PATH, gõ:

    set PATH (string match -v /usr/local/bin $PATH)
    

Lưu ý: lệnh set giúp hiển thị và thay đổi các variables trong shell.

Làm sao để biết chương trình nào ứng với đường dẫn nào trong $PATH

Dùng lệnh which nhé. Ví dụ muốn biết chương trình mang tên grep được chứa ở thư mục nào, gõ which grep, kết quả sẽ được tương tự như sau:

/bin/ls

Lưu ý: grep là viết tắt của "global regular expression print", dùng để so sánh các đoạn trong file text xem có chỗ nào giống (hoặc không giống) với điều kiện ta đưa ra hay không, sau đó lọc ra thứ ta cần.

Kết luận

  1. Các câu lệnh và kết quả in ra trong bài viết này có thể khác đôi chút với các shell khác nhau, nhưng nguyên lý là không đổi. Để tìm câu lệnh phù hợp với máy mình, tốt nhất là vào đọc hướng dẫn của shell đó, ví dụ với fish đọc ở đây, còn không thì google với từ khóa $PATHtên-shell-mặc-định-trên-máy.

  2. Ngoài những thứ trên, lúc đọc còn thấy quá trời những điều ngang dọc như:

    • $PATH còn thuộc về 1 thứ là environment variable.
    • Ngoài thứ tự ưu tiên bên trong $PATH, sẽ còn những thứ tự ưu tiên bên ngoài $PATH, ví dụ như aliases, exported functions, built-in shell commands, v.v.
    • Current directory ký hiệu bằng dấu chấm ".".
    • Mấy file .bashrc với .bash_profile khác nhau chỗ nào?

Những cái trên sẽ để tìm hiểu sau.

PS: Sau khi thử thay đổi $PATH trong máy, vấn đề gốc ban đầu là cài và chạy jrnl vẫn chưa được giải quyết. ts.

Tham khảo sau này:

ngminhtrung 26-01-2018

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

ngminhtrung

31 bài viết.
15 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
25 5
Ghi chú: Tiêu đề hoàn toàn mang tính câu view. Bài copy từ blog của tác giả :) Tại sao lại có bài viết này? Một ngày đẹp giời tôi cần kiểm t...
ngminhtrung viết 2 tháng trước
25 5
White
4 11
Nói thực, tôi cũng không biết gì về (Link) cho đến hôm bị cô bạn (Linh Ngô) đè ra cài ngấu nghiến trên máy và bảo cái này là "bắt buộc" nếu dùng Ma...
ngminhtrung viết 2 tháng trước
4 11
White
4 0
Vẽ Spirograph bằng D3.js Chắc hồi trẻ con ai cũng đã từng một lần nghịch 1 cái thước "sáng tạo" tên là "Spirograph" (/ˈspīrəˌɡraf/). Khi ấy ta đặt...
ngminhtrung viết 1 tháng trước
4 0
Bài viết liên quan
White
18 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết hơn 1 năm trước
18 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
31 bài viết.
15 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!