Thay thế các lệnh shell của OS X bằng các phiên bản linux?


32

Các lệnh có sẵn theo mặc định trong Terminal trong OS X, dường như không hoạt động giống như các phiên bản linux của chúng. Làm thế nào tôi có thể thay thế tất cả chúng bằng các lệnh GNU linux thực tế?

Ví dụ: sed -i yêu cầu một đối số "" bổ sung khó chịu. Ngoài ra, nó chỉ hoạt động với các tập tin văn bản. Điều này là vô ích.


1
Umm ... sed là một "trình soạn thảo văn bản", nó cũng có thể sửa đổi các tệp nhị phân. Bạn muốn nó làm gì nữa? Hãy giải thích chính xác những gì bạn cần. Tôi không thể hiểu vấn đề của bạn, bạn có thể cho một số ví dụ nữa?
terdon

3
Trên thực tế, sed là một biên tập viên dòng . Không phải là mô phạm, nhưng thực tế nó không có nghĩa là sửa đổi các tệp, trừ khi các tệp đó là luồng. Đó chính xác là lý do tại sao -icờ không chuẩn . edlà để chỉnh sửa tập tin.
kojiro

Câu trả lời:


43

Trong trường hợp chung, bạn không thể (hoặc không nên ) thay thế các lệnh mặc định. Lý do là nhiều tập lệnh quản trị hệ thống và các gói của bên thứ ba có thể dựa vào các lệnh này để hành xử theo cách chúng thực hiện ngoài hộp trên OS X.

Vì vậy, nếu bạn xóa sạch các lệnh hệ thống và thay thế chúng bằng các tương đương GNU có hành vi không tương thích hoặc đối số dòng lệnh, nó có thể sẽ phá vỡ một cái gì đó. Đặc biệt là nếu bạn sử dụng một số phần mềm được "chuyển" sang Mac OS X sau khi được thiết kế ban đầu để chạy trên Linux hoặc BSD, vì các loại chương trình này có nhiều khả năng dựa vào tập lệnh shell và lệnh hệ thống thay vì gọi API OS X.

Những gì bạn có thể làm là cài đặt một môi trường cài đặt các tiện ích GNU trong thư mục khác mà không ghi đè mặc định, sau đó điều chỉnh PATHbiến môi trường của bạn để nó ưu tiên cho các lệnh được tìm thấy trong thư mục GNU trước khi nó thậm chí tìm kiếm các thư mục hệ thống. Bạn có thể kết nối nó để nó chỉ thiết lập PATH của bạn theo cách đó nếu bạn đang bắt đầu một vỏ tương tác; bạn có thể google làm thế nào để làm điều này với bashhoặc hỏi một câu hỏi khác trên SU (hoặc tìm kiếm nó, vì có thể nó đã được hỏi trước đó) nếu bạn muốn làm điều đó.

Một ví dụ về môi trường như vậy là Homebrew , ví dụ có GNU sedtrong số những thứ khác. Khi bạn đã cài đặt Homebrew, bạn có thể nhập

brew install coreutils

và cài đặt GNU Coreutils . Những điều này sẽ cung cấp cho bạn sed, date, printf, wcvà nhiều công cụ khác mà tàu với GNU / Linux, nhưng không phải OS X. Tuy nhiên, để không "đè" nhị phân OS X mặc định, họ sẽ được bắt đầu bằng gtheo mặc định. Vì vậy, sau khi cài đặt Coreutils, nếu bạn muốn sử dụng GNU sed, hãy gõ

gsed

Nếu điều này quá rắc rối để gõ mỗi lần, bạn có thể thêm thư mục "gnubin" vào PATH của bạn và chỉ cần gọi GNU sed với sed. Bạn sẽ cần thêm các mục sau vào ~/.bash_profile:

PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"

Tất nhiên, nếu bạn cần một môi trường Linux từ súp đến các loại hạt (kernel, X11, khả năng tương thích tòa nhà, v.v.), bạn sẽ phải chạy Linux trong một máy ảo, chẳng hạn như VirtualBox . Đây là một đặt cược an toàn nếu bạn cần chạy phần mềm hoặc tập lệnh được thiết kế để chạy trên Linux.

Homebrew sẽ chỉ đủ khả năng tương thích cho bạn đối với một số loại chương trình không yêu cầu hành vi dành riêng cho Linux. Ví dụ inotifychỉ có sẵn trên Linux. drm(Trình quản lý kết xuất trực tiếp) chỉ khả dụng trên Linux. Có một số cuộc gọi hệ thống cấp thấp khác chỉ có trên Linux và không có tương đương tồn tại trên OS X, do đó, việc chuyển một số chương trình từ Linux sang OS X có thể không thực tế hoặc không thể thực hiện được nếu không có thay đổi mã đáng kể.


Luôn có Boot Camp . :)
kojiro

13
Vì lý do gì brew install coreutilskhông bao gồm sed. brew install gnu-sedTuy nhiên, bạn có thể cài đặt gsedvà không sed, ngay cả khi bạn cập nhật $PATH. Tôi đã tạo một liên kết tượng trưng để ẩn Mac sed: ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sedtuy nhiên bạn vẫn phải làm man gsedđể xem đúng trang.
dimo414

6
brew install gnu-sed --default-namessẽ cài đặt nó dưới dạngsed
ivotron

1
Thay vì --default-names, bạn có thể cài đặt với các lệnh g-prefixed và sau đó cài đặt oh-my-zsh (rất khuyến khích) và kích hoạt plugin gnu-utils.
bibstha

3

Bạn có thể sử dụng Tiền tố Gentoo hỗ trợ OS X, bạn có thể thực hiện việc này bằng cách khởi động nó và sau đó thêm các đường dẫn có liên quan trong thư mục tiền tố vào PATH của bạn. Nó có thể là điều này đã làm điều đó cho bạn. Sau khi hoàn thành, bạn có thể sử dụng các lệnh Gentoo tiêu chuẩn để cài đặt các gói.

emerge coreutils sẽ giúp bạn có các tiện ích GNU tiêu chuẩn, ví dụ.

Xin lưu ý rằng Gentoo biên dịch theo mặc định, thay vào đó bạn có thể muốn thiết lập máy chủ nhị phân . Đây chỉ là sử dụng một trong các URL ở nửa sau của bài viết đó và đặt nó vào PORTAGE_BINHOST="... your url here ..."trong ./etc/make.conftiền tố của bạn.


1

Theo dõi bài đăng của @ allquixotic, đây là hướng dẫn chính thức cho mỗi brew install coreutils

Tất cả các lệnh đã được cài đặt với tiền tố 'g'.

Nếu bạn thực sự cần sử dụng các lệnh này với tên bình thường của chúng, có thể thêm thư mục "gnubin" vào PATH của bạn từ bashrc của bạn như

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

Ngoài ra, bạn có thể truy cập các trang man của họ với tên bình thường là thư mục "gnuman" vào MANPATH của bạn từ bashrc của bạn

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

0

Đối với sedbạn có thể tải xuống một nhị phân được biên dịch sẵn từ Rudixdự án. Đối với Rudixcác gói tiếp theo xem ở đâyở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.