6 điểm bởi GN⁺ 2025-03-23 | 1 bình luận | Chia sẻ qua WhatsApp
  • Nhiều tiện ích dòng lệnh hỗ trợ cả tùy chọn dạng ngắn (-f) và dạng dài (--force)
  • Dạng ngắn dành cho sử dụng tương tác; trong script nên dùng dạng dài
  • Ví dụ, trong terminal bạn sẽ gõ $ git switch -c my-new-branch.
  • Trong script phát hành, hãy viết như sau:
    • try shell.exec("git fetch origin --quiet", .{});
    • try shell.exec("git switch --create release-{today} origin/main", .{ .today = stdx.DateUTC.now() }, );
  • Tùy chọn dạng dài mang tính mô tả rõ ràng hơn nhiều đối với người đọc

1 bình luận

 
GN⁺ 2025-03-23
Ý kiến trên Hacker News
  • Tôi thích các tùy chọn dài, nhưng khi cần gọi các lệnh POSIX theo cách có tính di động thì tùy chọn ngắn là lựa chọn duy nhất. POSIX không quy định tùy chọn dài

    • Ví dụ, có thể tham khảo đặc tả của diff
    • Trong đa số trường hợp, dùng binding thư viện là lựa chọn tốt hơn so với phụ thuộc vào tiện ích POSIX
    • Thay vì gọi grep, dùng thứ như libpcre có thể hiệu quả hơn
    • Với các tiện ích không thuộc POSIX như git, hg, rg, ag..., việc dùng tùy chọn dài là hợp lý
  • Không nên trộn nội suy chuỗi với việc thực thi lệnh

    • Đặc biệt cần cẩn thận khi lệnh được xử lý thông qua shell
    • Dù là ngôn ngữ nào, nên dùng API thực thi dựa trên danh sách hoặc mảng để truyền trực tiếp đối số vào execv(2), execvp(2)...
  • Tôi đồng ý rằng nên dùng tùy chọn dài, nhưng cần cân nhắc tính di động

    • Không phải mọi bản phân phối BSD đều hỗ trợ tùy chọn dài kiểu GNU
    • Nếu muốn tính di động, bạn nên dùng tùy chọn ngắn
  • Đừng quên dùng -- sau tất cả các tùy chọn và trước các đối số động

  • Trước khi gọi lệnh, cần kiểm tra xem độ dài lệnh có vượt quá ARG_MAX hay không

    • Ví dụ, khi có lệnh như sau:
      • grep --ignore-case --files-with-matches -- "hello" *.c
    • Nên gọi như thế này:
      • CMD="grep --ignore-case --files-with-matches -- \"hello\" *.c"
      • ARG_MAX=$(getconf ARG_MAX)
      • CMD_LEN=${#CMD}
      • if (( CMD_LEN > ARG_MAX )); then
      • echo "Error: Command length ($CMD_LEN) exceeds ARG_MAX ($ARG_MAX)." >&2
      • exit 1
      • fi
      • eval "$CMD" # Cảnh báo: đánh giá tên tệp
  • Tôi đồng ý với cách này. Một lợi ích khác là sẽ dễ grep trang man hơn để tìm xem tùy chọn đó làm gì

  • Nếu muốn làm cho script có thể chuyển sang các hệ POSIX khác, bạn có thể phải dùng tùy chọn ngắn

    • Tùy chọn dài không được tiêu chuẩn hóa
    • Bạn phải tự quyết định sự đánh đổi
  • Nên đặt mỗi tùy chọn trên một dòng riêng để dễ theo dõi và git blame

  • Đây là một trong những quy tắc cơ bản khi viết script. Nếu có thể dùng tùy chọn dài thì nên dùng

    • Làm như vậy quá hợp lý
  • Các tùy chọn dạng dài mang tính mô tả cao hơn nhiều đối với người đọc

    • Ít xảy ra lỗi gõ nhầm hơn