Khi mở Terminal trên macOS, nhiều người dùng thường có cảm giác như đang làm việc trong một môi trường Linux đầy đủ. Tuy nhiên, không ít người nhanh chóng nhận ra rằng các lệnh dòng lệnh trên macOS không hoàn toàn giống với những gì họ đã quen thuộc trên Linux. Điều này đôi khi gây ra sự khó chịu và cản trở quy trình làm việc. May mắn thay, có một giải pháp đơn giản và hiệu quả để giải quyết vấn đề này, giúp bạn tối ưu hóa trải nghiệm dòng lệnh trên hệ điều hành của Apple. Bài viết này sẽ đi sâu vào nguyên nhân của sự khác biệt và hướng dẫn bạn cách sử dụng Homebrew, một trình quản lý gói mạnh mẽ, để biến Terminal macOS trở thành một công cụ mạnh mẽ và linh hoạt hơn, tiệm cận với môi trường Linux mà bạn mong muốn.
Tại sao dòng lệnh macOS khác biệt với Linux?
Kể từ khi ra mắt OSX vào năm 2001, macOS đã đi kèm với một bộ tiện ích dòng lệnh quen thuộc với bất kỳ ai từng sử dụng Linux, như grep
, find
, vim
và nhiều lệnh khác. Tuy nhiên, điểm khác biệt cốt lõi nằm ở chỗ macOS sử dụng các phiên bản BSD của các chương trình này, thay vì các phiên bản GNU mà hầu hết các bản phân phối Linux đều tích hợp. Mặc dù về cơ bản chúng tương thích, nhưng sự khác biệt này gây ra hai vấn đề chính cho người dùng chuyên nghiệp.
Đầu tiên, một số phiên bản BSD hoạt động hơi khác một chút, với các tùy chọn thay thế, hành vi không mong muốn hoặc các phần mở rộng không quen thuộc. Bạn thường có thể giải quyết những vấn đề này bằng cách đọc các trang man
tương ứng hoặc đơn giản là thích nghi với hành vi của lệnh BSD. Tuy nhiên, những sự không nhất quán này có thể gây khó khăn trong việc quản lý, đặc biệt nếu bạn đang sử dụng song song cả Mac và Linux. Đôi khi, những khác biệt này còn bắt nguồn từ tuổi đời của các công cụ; các phiên bản BSD trên Mac thường cũ hơn so với các phiên bản GNU tương đương. Apple cũng không thường xuyên cập nhật các lệnh này, khiến chúng ngày càng lỗi thời giữa các bản phát hành hệ điều hành.
Vấn đề đáng kể hơn là macOS không cung cấp phiên bản tương đương của mọi lệnh mà bạn có thể đã quen thuộc. Mặc dù điều này không phải lúc nào cũng là một vấn đề, nhưng có một số thiếu sót đáng ngạc nhiên, chẳng hạn như công cụ tree
để hiển thị cấu trúc thư mục.
Trong quá khứ, giải pháp cho vấn đề này là “build from source”: tải xuống mã nguồn của chương trình, chạy một tập lệnh cấu hình, sau đó sử dụng lệnh make
để biên dịch mọi thứ. Quy trình này thường phức tạp và dễ gặp lỗi. Một lựa chọn khác là tìm một bản binary đã được biên dịch sẵn cho kiến trúc của bạn, nhưng quá trình này có thể tẻ nhạt và phần mềm đã biên dịch có thể không tương thích với môi trường của bạn. Tuy nhiên, ngày nay, đã có những cách tốt hơn để đưa các lệnh dòng lệnh trên macOS của bạn đạt đến mức mong muốn.
Homebrew: Giải pháp hoàn hảo cho các lệnh bị thiếu trên macOS
Kể từ năm 2016, Homebrew đã trở thành phương pháp tốt nhất để cài đặt phần mềm dòng lệnh trên máy Mac của bạn. Homebrew là một trình quản lý gói (package manager) cho phép bạn cài đặt phần mềm mà không cần phải biên dịch từ mã nguồn. Giống như bất kỳ trình quản lý gói nào, Homebrew đảm nhiệm việc biên dịch và cài đặt. Nó cũng xử lý mạng lưới các phần phụ thuộc (dependencies) mà một chương trình có thể yêu cầu để chạy, giúp quá trình này dễ dàng hơn nhiều so với việc biên dịch thủ công.
Bạn có thể sử dụng Homebrew để cài đặt nhiều loại chương trình, không chỉ giới hạn ở Mac App Store. Điều này đã mở ra hệ sinh thái Mac cho nhiều ứng dụng mã nguồn mở mà người dùng Linux đã quen thuộc. Nhiều nhà phát triển phần mềm miễn phí không mặn mà với tính chất đóng của cửa hàng Apple, vì lý do thực tế hoặc tư tưởng. Homebrew đã mở ra cánh cửa tiếp cận với nhiều phần mềm miễn phí chất lượng hơn bao giờ hết.
Phiên bản Homebrew hiện tại – 4.4 – hỗ trợ các bản phát hành macOS Ventura (13), Sonoma (14) và Sequoia (15).
Sau khi cài đặt Homebrew, việc thêm các lệnh bị thiếu trở nên dễ dàng. Ví dụ, để cài đặt chương trình wget
, bạn chỉ cần sử dụng lệnh sau:
brew install wget
Màn hình Terminal macOS hiển thị lệnh brew install wget để cài đặt công cụ wget
Nếu bạn vẫn cảm thấy việc sử dụng dòng lệnh quá phức tạp, bạn có thể dùng một giao diện người dùng đồ họa (GUI) cho Homebrew như Cork. Tuy nhiên, nếu bạn đang muốn cài đặt và sử dụng phần mềm dòng lệnh, bạn sẽ nhanh chóng làm quen và cảm thấy thoải mái với lệnh brew
quen thuộc.
Trên Mac dùng chip Apple Silicon (M1, M2, v.v.), Homebrew cài đặt các chương trình vào /opt/homebrew/bin
. Nó cũng sẽ tự động thêm vị trí này vào biến môi trường PATH
của bạn, do đó PATH
sẽ có dạng tương tự như:
...:/opt/homebrew/bin:.../usr/local/bin:...:/bin:...
Nói cách khác, các lệnh được cài đặt bởi Homebrew sẽ được ưu tiên, chạy thay vì bất kỳ lệnh trùng lặp nào được hệ thống cung cấp trong /bin
, chẳng hạn.
Bạn có thể sử dụng lệnh which
để kiểm tra vị trí của bất kỳ chương trình nào. Ví dụ:
$ which find
/usr/bin/find
Tùy chọn -a
sẽ hiển thị tất cả các vị trí của một lệnh trong PATH
của bạn, giúp bạn kiểm tra các lệnh trùng lặp và xác minh rằng bạn đang sử dụng đúng phiên bản:
$ which -a [...]
Hãy nhớ rằng hầu hết các lệnh đều chấp nhận tùy chọn --version
hoặc --help
để cho bạn biết phiên bản bạn đang sử dụng. Một chi tiết quan trọng khác là các công cụ GNU thường được cài đặt với một tên khác để tránh xung đột. Ví dụ, gói Homebrew cho sed
được gọi là gnu-sed
, và nó được cài đặt dưới dạng gsed
:
Terminal macOS cho thấy quá trình cài đặt gsed bằng Homebrew và kiểm tra đường dẫn của gsed
Phiên bản sed
của BSD không thực sự có số phiên bản, nhưng trang man
của nó trong Sequoia ghi ngày là tháng 6 năm 2020. Bạn cũng có thể cài đặt bộ công cụ cốt lõi của GNU (coreutils) để có các phiên bản GNU của các lệnh quen thuộc:
brew install coreutils
Những công cụ dòng lệnh quan trọng thường bị thiếu trên macOS
Lần đầu tiên tôi nhận ra có điều gì đó “không ổn” với bộ công cụ của macOS là khi tôi muốn sử dụng tiện ích tree
đáng tin cậy. Mặc dù tree
không phải là thiết yếu, nhưng nó vô cùng hữu ích. Lệnh này hiển thị toàn bộ hệ thống phân cấp của một thư mục, in tất cả các tệp và thư mục bên dưới nó, giống như một lệnh ls
được tăng cường sức mạnh. Nhưng nó sẽ không hoạt động trên một cài đặt macOS tiêu chuẩn:
Màn hình dòng lệnh macOS thông báo lỗi 'command not found' khi chạy lệnh tree
Trước đây, tôi thường giải quyết vấn đề này bằng một tập lệnh shell đơn giản để thực hiện chức năng tương tự. Nhưng tập lệnh đó thiếu tất cả các tùy chọn của tree
, vốn rất phong phú:
Trang man page của lệnh tree hiển thị danh sách các tùy chọn và chức năng phong phú
Homebrew cho phép bạn cài đặt tree
, cung cấp đầy đủ lệnh với tất cả các tùy chọn của nó. Đây là phiên bản tree
mới nhất: 2.2.1, được phát hành vào tháng 11 năm 2024.
Một chương trình rất phổ biến khác cũng bị thiếu một cách đáng chú ý là Emacs. Đúng là Emacs cũng thường bị thiếu trong các bản phân phối Linux hiện đại, nhưng điều đó không làm cho việc nó bị bỏ qua khỏi macOS trở nên dễ hiểu hơn.
Giao diện trình soạn thảo văn bản GNU Emacs đang mở trong cửa sổ Terminal
Emacs là một trình soạn thảo văn bản phổ biến và là một lựa chọn thay thế mạnh mẽ cho vim
, vì vậy bạn có thể muốn sử dụng hoặc thử nó nếu chưa từng. May mắn thay, Emacs chỉ cách một lệnh brew install emacs
nhanh chóng.
Lệnh find
là một trong nhiều lệnh mà, mặc dù có sẵn trên macOS, nhưng hoạt động hơi khác một chút trong phiên bản BSD của nó. Hai phiên bản hỗ trợ các tùy chọn và hành vi hơi khác nhau, khiến việc chuyển đổi giữa chúng trở nên khó khăn.
Lệnh find
của Homebrew là một phần của gói findutils
, vì vậy bạn có thể cài đặt nó như sau:
brew install findutils
Bạn nên lưu ý rằng Homebrew cài đặt lệnh này dưới dạng gfind
. Homebrew thường sử dụng quy ước tiền tố “g” cho các phiên bản tương đương GNU của các lệnh tích hợp sẵn để cả hai phiên bản có thể cùng tồn tại:
Kiểm tra đường dẫn của lệnh find và gfind trên macOS bằng lệnh which
Điều này nhằm đảm bảo phiên bản find
mặc định của BSD được ưu tiên, nhưng nó có thể gây nhầm lẫn và khó nhớ. Nếu bạn muốn sử dụng GNU find
theo mặc định, bạn có thể thêm thư mục này vào PATH
của mình:
/opt/homebrew/opt/findutils/libexec/gnubin
Thư mục đó sẽ có một liên kết tượng trưng (symlink) tên “find” trỏ đến tệp thực thi “gfind” trong /opt/homebrew/bin
. Hãy nhớ thêm nó vào trước /usr/bin
trong PATH
của bạn để đảm bảo shell của bạn tìm thấy phiên bản GNU trước.
Tận dụng Homebrew để nâng tầm trải nghiệm dòng lệnh macOS
Homebrew không chỉ đơn thuần là một trình cài đặt gói; nó là một cánh cửa mở ra toàn bộ thế giới các công cụ dòng lệnh mạnh mẽ và linh hoạt cho người dùng macOS. Từ việc khắc phục những khác biệt nhỏ giữa các phiên bản lệnh BSD và GNU, cho đến việc bổ sung các tiện ích quan trọng bị thiếu như tree
hoặc trình soạn thảo Emacs
, Homebrew đều mang đến giải pháp hiệu quả.
Bằng cách sử dụng Homebrew, bạn có thể dễ dàng cài đặt các lệnh thiết yếu, bao gồm cả các phiên bản GNU mà bạn có thể đã quen thuộc hơn, cung cấp hành vi nâng cao hoặc thay thế. Điều này giúp đồng bộ hóa môi trường làm việc dòng lệnh của bạn giữa macOS và Linux, tối ưu hóa quy trình phát triển và tăng cường hiệu suất làm việc.
Với Homebrew, bạn không còn phải lo lắng về việc các lệnh cơ bản trên macOS không hoạt động như mong đợi hay thiếu đi các công cụ cần thiết. Hãy khám phá và tận dụng sức mạnh của Homebrew để biến Terminal trên chiếc Mac của bạn thành một môi trường dòng lệnh chuyên nghiệp và hiệu quả hơn bao giờ hết. Bạn đã sử dụng Homebrew để cài đặt những công cụ nào? Hãy chia sẻ kinh nghiệm của bạn trong phần bình luận bên dưới!