Làm thế nào để giữ cho dotfiles hệ thống bất khả tri?


21

Do công việc gần đây tôi đã bắt đầu sử dụng OS X và đã thiết lập nó bằng cách sử dụng homebrew để có được trải nghiệm tương tự như với Linux.

Tuy nhiên, có khá nhiều sự khác biệt trong cài đặt của họ. Một số chỉ cần được đặt trên một hệ thống. Khi các dotfiles của tôi sống trong kho lưu trữ git, tôi đã tự hỏi loại công tắc nào tôi có thể đặt tại chỗ, để một số cấu hình chỉ được đọc cho hệ thống Linux và khác cho OS X.

Đối với dotfiles, tôi đang đề cập đến, trong số khác, .bash_profileshoặc .bash_alias.


Tôi đã làm điều này với các chi nhánh git. Tôi có một cái cho FreeBSD, Gentoo và Ubuntu. Nhưng điều này không lý tưởng.
Raphael AhDR

@RaphaelAhrens Tôi muốn tránh một giải pháp dựa trên chi nhánh như vậy vì nó dễ bị phân kỳ.
k0pernikus

Vâng, bạn có thể làm cho nó dễ dàng hơn một chút khi bạn đặt các công cụ cụ thể của hệ thống vào các tệp đặc biệt. Nhưng như tôi đã nói không lý tưởng.
Raphael AhDR

stackoverflow.com/questions/394230/ Mạnh Bạn có thể kiểm tra Darwin trên OS X.
Raphael Ahrens

Cách tiếp cận của tôi về cơ bản sôi sục if (exists rcfile.local); source rcfile.local; endif, dịch sang tập tin RC thích hợp. Các tập tin RC chính tôi cố gắng giữ bất khả tri hệ thống, trong khi .localphiên bản có cài đặt cụ thể hệ thống. Nếu bạn muốn tất cả trong một repo duy nhất, bạn có thể có các thư mục hệ thống và liên kết tượng trưng cho RCfile.local đến một trong thư mục chính xác.
jw013

Câu trả lời:


22

Giữ các dotfiles càng di động càng tốt và tránh các cài đặt hoặc chuyển đổi phụ thuộc hệ điều hành yêu cầu một phiên bản cụ thể của công cụ, ví dụ: tránh cú pháp GNU nếu bạn không sử dụng phần mềm GNU trên tất cả các hệ thống.

Bạn có thể sẽ gặp phải tình huống muốn sử dụng các cài đặt cụ thể của hệ thống. Trong trường hợp đó, sử dụng câu lệnh chuyển đổi với các cài đặt riêng lẻ:

case $(uname) in
  'Linux')   LS_OPTIONS='--color=auto --group-directories-first' ;;
  'FreeBSD') LS_OPTIONS='-Gh -D "%F %H:%M"' ;;
  'Darwin')  LS_OPTIONS='-h' ;;
esac

Trong trường hợp các tệp cấu hình của các ứng dụng tùy ý yêu cầu các tùy chọn khác nhau, bạn có thể kiểm tra xem ứng dụng có cung cấp các công tắc tương thích hoặc các cơ chế khác không. Chẳng vimhạn, bạn có thể kiểm tra phiên bản và patchlevel để hỗ trợ các tính năng phiên bản cũ hơn hoặc các phiên bản được biên dịch với một bộ tính năng khác, không có. Đoạn trích từ .vimrc:

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif

uname -scũng giống như uname. uname là viết tắt của tên Unix.
Stéphane Chazelas

1
@StephaneChazelas Nó chỉ xảy ra hoặc được bảo đảm trên các hệ thống và tôi luôn có thể bỏ qua -s?
Marco

1
vâng, unamemột mình đã là cách kinh điển để làm điều đó trong nhiều thập kỷ và được chỉ định bởi POSIX. Bản gốc uname(trong PWB Unix) không có bất kỳ tùy chọn nào.
Stéphane Chazelas

@StephaneChazelas Cảm ơn bạn đã làm rõ, tôi đã xóa -scâu trả lời này và tôi sẽ ghi nhớ nó cho các kịch bản tương lai của tôi.
Marco

Đó là một chi tiết tương đối nhỏ và không làm mất đi điểm được minh họa bằng ví dụ của bạn, nhưng những trích dẫn trong vimrc có setthực sự được coi là U + 201C và U + 201D thay vì U + 0022 không?
một CVn

3

Nếu bạn chỉ quan tâm đến các tệp thực sự được thực thi, chẳng hạn như .bash_profiles và bạn bè, bạn có thể thoát khỏi việc sử dụng ví dụ unameđể phân biệt dựa trên hệ thống mà mã chạy trên đó.

Ví dụ: hoàn toàn chưa được kiểm tra và với lời cảnh báo rằng tôi không có OS X để thử mọi thứ, nếu bạn hiện có trên Linux:

alias ll='ls -lFA'

và trên Mac OS X:

alias ll='ls -lFAx'

(nơi -xlàm cho OS X lslàm một cái gì đó mà GNU ls làm theo mặc định), sau đó chúng có thể được kết hợp thành một cái gì đó như thế này:

OS="$(uname -s)"
if test "$OS" = "Darwin"; then
    alias ll='ls -lFAx'
    # ...other OS X-specific things go here...
else if test "$OS" = "Linux"; then
    alias ll='ls -lFA'
    # ...other Linux-specific things go here...
fi
# ...generic things go here...

Yêu cầu duy nhất sau đó là uname -scác tác phẩm trong phần lớn theo cùng một cách (nó nên, vì cả hai hệ thống này một cách hợp lý POSIX-y và -s uname là yêu cầu của POSIX (nhờ Marco cho chỉ ra này )), và đó là cú pháp cho shell script nhánh dựa trên một so sánh chuỗi là như nhau. Bạn có thể có thể kiểm tra dựa trên các tiêu chí khác là tốt; ví dụ: bạn có thể tìm / etc / lsb_release, kiểm tra xem / Proc / sys / kernel / ostype có chứa "Linux" hay bất kỳ thử nghiệm nào khác mà bạn có thể đưa ra.


@RaphaelAhrens Đó là Darwin, tôi vừa kiểm tra.
k0pernikus

@RaphaelAhrens Giống như tôi đã viết, tôi không có OS X để thử mọi thứ, vì vậy tôi đã đoán mò để thể hiện ý tưởng thay vì dành nhiều thời gian cho một chi tiết tương đối quan trọng mà OP có thể tìm ra một cách tầm thường.
một CVn

Wikipedia để giải cứu en.wikipedia.org/wiki/Uname nếu ai đó muốn có bash cho Windows hoặc những thứ khác.
Raphael Ahrens

1
Công -otắc uname không phải là POSIX và bị lỗi trên nhiều hệ thống, ví dụ Solaris. -slà bắt buộc trên POSIX và cách tương thích nhất. IEEE Std 1003.1
Marco

2
OSTYPEkhông có sẵn trong vỏ POSIX. Ví dụ, nó sẽ không thành công khi cài đặt FreeBSD mặc định và chỉ có thể được sử dụng trong .bashrchoặc .zshrc. Nó không làm việc đáng tin cậy tại .profile, .aliasvv Kể từ khi chúng ta đang nói về compatibiliy ở đây, tôi muốn khuyên để đi theo con đường an toàn, thay vì dựa vào các tính năng đặc biệt vỏ, mà không đảm bảo được cung cấp trên mọi hệ thống.
Marco
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.