3 điểm bởi GN⁺ 2023-11-24 | 1 bình luận | Chia sẻ qua WhatsApp

Các tệp nhị phân thú vị trong hệ thống Unix

  • Trong hệ thống Unix có những tệp nhị phân mà tên chỉ là một ký hiệu đơn lẻ.
  • Khi chạy lệnh /bin/[, có thể thấy một chương trình mang tên [.
  • [test cùng trỏ tới một tệp nhị phân, và hai lệnh này thực tế thực hiện cùng một chức năng.

Cách dùng chương trình test[

  • Chương trình test được dùng để đánh giá biểu thức trong shell.
  • Nó được dùng để so sánh chuỗi, so sánh số, kiểm tra điều kiện tệp, v.v.
  • test nhận đối số để đánh giá biểu thức, và trả về 0 nếu đúng, 1 nếu sai.

Lý do tồn tại của hai lệnh

  • Lý do tồn tại cả hai lệnh test[ không thật sự rõ ràng, nhưng có thể đoán là để tăng tính dễ đọc.
  • Dùng lệnh [ có thể biểu diễn câu lệnh điều kiện gọn gàng hơn test.
  • Khi dùng [, đối số cuối cùng của lệnh phải kết thúc bằng ].

Khác biệt giữa lệnh built-in và tệp nhị phân bên ngoài

  • test[ thường được dùng trong shell script, nên trong hầu hết shell chúng được cài đặt như lệnh built-in.
  • Khi dùng built-in và tệp nhị phân bên ngoài, hành vi có thể khác nhau, và sự khác biệt này cũng có thể thay đổi tùy theo shell.

Cách dùng [[ và điểm khác biệt

  • [[ là một mở rộng của Bash dùng để thay thế cách dùng [.
  • Với vai trò là lệnh built-in, [[ có thể thay đổi các quy tắc cơ bản của ngôn ngữ bên trong biểu thức.
  • Khi so sánh chuỗi, [[ xử lý glob pattern như ký tự nguyên văn, nên có thể cho ra kết quả khác.

Lựa chọn khi viết shell script

  • Khi viết shell script có tính di động, nên dùng [.
  • Nếu viết script chỉ dành cho Bash, dùng [[ sẽ cung cấp nhiều tính năng hơn.

Kết hợp biểu thức shell và biểu thức test

  • Shell có các biểu thức riêng thông qua các toán tử !, &&, ||.
  • Có thể kết hợp biểu thức test và biểu thức shell thành một lệnh duy nhất.

Ý kiến của GN⁺

Điểm quan trọng nhất của bài viết này là trong hệ thống Unix, [test tồn tại như hai lệnh khác nhau nhưng thực hiện cùng một chức năng, và điều này được cho là nhằm cải thiện tính dễ đọc và hiệu quả của shell script. Thông tin này có thể hữu ích cho các kỹ sư phần mềm mới bắt đầu khi viết hoặc đọc shell script, đồng thời giúp hiểu rõ hơn nguyên lý hoạt động của shell script và sự khác biệt giữa các shell khác nhau. Điều khiến bài viết này thú vị là nó cho thấy các công cụ nền tảng của shell script có thể được sử dụng dưới nhiều hình thức khác nhau như thế nào, đồng thời làm nổi bật sự phức tạp và tính linh hoạt của lập trình shell.

1 bình luận

 
GN⁺ 2023-11-24
Ý kiến trên Hacker News
  • Lời cảm ơn từ tác giả gốc và đề xuất sửa tiêu đề

    Tác giả gốc gửi lời cảm ơn vì bài viết đã được quan tâm, đồng thời đề xuất thêm năm vào tiêu đề và tránh viết hoa từ "test" vì đây là một lệnh thực sự.

  • Lịch sử của lệnh "test" trong Bourne shell và sở thích cá nhân

    Giải thích rằng Bourne shell được tạo ra vào thời chưa có IDE, nên lệnh "test" đã được dùng mà không có dấu ngoặc hay ngoặc vuông. Cá nhân người này nói rằng họ thích dạng "test" hơn dạng ngoặc vuông.

  • Ví dụ về câu lệnh điều kiện không dùng khối if

    Giới thiệu cách viết điều kiện ngắn gọn mà không cần khối if, đồng thời đưa ra ví dụ in thông tin debug ra stderr một cách có điều kiện.

  • Cách kết hợp khối if với lệnh thông thường

    Cho thấy khối if có thể kiểm tra các lệnh thông thường, ví dụ như dùng lệnh grep để tìm kiếm trong log.

  • Băn khoăn về việc dùng toán tử logic trong lệnh test

    Bày tỏ sự phân vân giữa việc dùng toán tử logic ngay trong lệnh test hay dùng các câu điều kiện riêng. Nếu không có vấn đề hiệu năng thì cả hai cách đều có lý do hợp lý.

  • Lợi ích của việc dùng lệnh "test" và sự tiện lợi của "man test"

    Cho biết từ vài năm trước đã chủ trương dùng lệnh "test" thay vì ngoặc vuông. Cách này nhấn mạnh rằng "test" chỉ là một lệnh đơn giản, và việc dùng "man test" cũng thuận tiện hơn so với tìm trong "man bash".

  • Lưu ý về hành vi của [test khi chỉ có một đối số

    Cảnh báo rằng khi kiểm tra biến có rỗng hay không, nếu không đặt biến trong dấu ngoặc kép thì có thể dẫn đến kết quả ngoài mong đợi. Nhấn mạnh rằng cần phải đặt biến trong dấu ngoặc kép.

  • Sự khác biệt giữa /bin/[/bin/test trên Linux và NetBSD

    Chia sẻ rằng trên Linux, /bin/[/bin/test là khác nhau, còn trên NetBSD thì chúng là một.

  • Chia sẻ liên kết blog để tìm hiểu sâu hơn về test/[/[[ và những điều kỳ lạ của shell

    Chia sẻ tài liệu giúp hiểu sâu hơn về test, [, [[, cùng với liên kết blog giải thích nhiều đặc điểm khác nhau của shell.

  • Chỉ ra rằng [[ là riêng của bash và khuyên dùng [[ nếu chắc chắn đang dùng bash

    Đề cập rằng [[ là lệnh chỉ dành cho bash, và khuyên rằng nếu chắc chắn dùng bash thì nên dùng [[.

  • Sự bối rối khi nhận ra [ không phải là một phần của ngôn ngữ script bash

    Bày tỏ rằng đã từng thấy khó hiểu khi nhận ra [ không phải là một phần của ngôn ngữ script bash mà chỉ là một chương trình đơn giản, và mong được giải thích thêm về điều này.

  • Quan điểm mạnh về shell và sự phản đối việc dùng [

    Thể hiện quan điểm rất mạnh rằng không nên dùng [, mà chỉ nên dùng "test". Nhấn mạnh rằng [ trông như cú pháp ngôn ngữ nhưng thực tế là một chương trình, đồng thời cho rằng nên dùng câu lệnh case để đánh giá chuỗi.