จะรักษาระบบที่ไม่เชื่อเรื่องพระเจ้าได้อย่างไร?


21

เนื่องจากการทำงานฉันเพิ่งเริ่มใช้ OS X และได้ตั้งค่าโดยใช้ homebrew เพื่อรับประสบการณ์คล้ายกับ Linux

อย่างไรก็ตามมีความแตกต่างเล็กน้อยในการตั้งค่าของพวกเขา บางระบบต้องอยู่ในระบบเดียวเท่านั้น เมื่อ dotfiles ของฉันอยู่ในพื้นที่เก็บข้อมูลคอมไพล์ฉันสงสัยว่าสวิตช์ชนิดใดที่ฉันสามารถตั้งค่าได้ดังนั้นการกำหนดค่าบางอย่างจะอ่านเฉพาะระบบ Linux และอื่น ๆ สำหรับ OS X

ในฐานะที่เป็น dotfiles ผมหมายในหมู่อื่น ๆ เพื่อหรือ.bash_profiles.bash_alias


ฉันทำสิ่งนี้กับสาขาคอมไพล์ ฉันมีหนึ่งสำหรับ FreeBSD, Gentoo และ Ubuntu แต่นี่ไม่เหมาะ
Raphael Ahrens

@RaphaelAhrens ฉันต้องการหลีกเลี่ยงการแก้ปัญหาตามสาขาเนื่องจากมีแนวโน้มที่จะแตกต่าง
k0pernikus

ใช่คุณสามารถทำให้มันง่ายขึ้นเล็กน้อยเมื่อคุณวางสิ่งที่ระบบเฉพาะลงในไฟล์พิเศษ แต่อย่างที่ฉันบอกว่าไม่เหมาะ
Raphael Ahrens

stackoverflow.com/questions/394230/…คุณสามารถตรวจสอบดาร์วินบน OS X ได้
Raphael Ahrens

วิธีการของฉันโดยทั่วไปif (exists rcfile.local); source rcfile.local; endifแล้วแปลเป็นไฟล์ rc ที่เหมาะสม ไฟล์ rc หลักฉันพยายามทำให้ระบบไม่เชื่อเรื่องพระเจ้าในขณะที่.localรุ่นนั้นมีการตั้งค่าเฉพาะของระบบ หากคุณต้องการทั้งหมดใน repo เดียวคุณสามารถมีระบบ dirs และ symlink rcfile.local กับหนึ่งในไดเรกทอรีที่ถูกต้อง
jw013

คำตอบ:


22

ทำให้ dotfiles พกพาได้มากที่สุดและหลีกเลี่ยงการตั้งค่าหรือสวิทช์ที่ขึ้นอยู่กับระบบปฏิบัติการที่ต้องการเครื่องมือรุ่นใดรุ่นหนึ่งโดยเฉพาะเช่นหลีกเลี่ยงไวยากรณ์ของ GNU หากคุณไม่ใช้ซอฟต์แวร์ GNU ในทุกระบบ

คุณอาจพบสถานการณ์ที่ต้องการใช้การตั้งค่าเฉพาะของระบบ ในกรณีนั้นให้ใช้คำสั่ง switch พร้อมการตั้งค่าส่วนบุคคล:

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

ในกรณีที่ไฟล์กำหนดค่าของแอพพลิเคชั่นโดยพลการต้องการตัวเลือกที่แตกต่างกันคุณสามารถตรวจสอบว่าแอพพลิเคชั่นนั้นมีสวิตช์ความเข้ากันได้หรือกลไกอื่น ๆ ตัวอย่างvimเช่นคุณสามารถตรวจสอบเวอร์ชันและแพทช์เลเวลเพื่อสนับสนุนฟีเจอร์ที่เก่ากว่าหรือเวอร์ชั่นที่คอมไพล์ด้วยชุดฟีเจอร์ต่าง ๆ ที่ไม่มี ตัวอย่างข้อมูลจาก.vimrc:

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

uname -sunameเป็นเหมือน uname ย่อมาจากชื่อ Unix
Stéphane Chazelas

1
@StephaneChazelas มันแค่เกิดขึ้นหรือรับประกันในระบบและฉันสามารถวางได้ตลอดเวลา-s?
Marco

1
ใช่unameเพียงอย่างเดียวเป็นวิธีที่ได้รับการยอมรับมานานหลายทศวรรษและถูกระบุโดย POSIX ต้นฉบับuname(ใน PWB Unix) ไม่มีตัวเลือกใด ๆ
Stéphane Chazelas

@StephaneChazelas ขอบคุณสำหรับความกระจ่างฉันลบออก-sจากคำตอบนี้และฉันจะเก็บไว้ในใจสำหรับสคริปต์ในอนาคตของฉัน
Marco

มันเป็นรายละเอียดที่ค่อนข้างน้อยและไม่เบี่ยงเบนจากจุดที่แสดงในตัวอย่างของคุณ แต่คำพูดเหล่านั้นใน vimrc setควรจะเป็น U + 201C และ U + 201D แทนที่จะเป็น U + 0022 ใช่ไหม
CVn

3

หากคุณเกี่ยวข้องกับไฟล์ที่ดำเนินการจริงเท่านั้นเช่น. bash_profiles และเพื่อน ๆ คุณอาจสามารถใช้งานเช่นunameเพื่อแยกความแตกต่างตามระบบที่โค้ดทำงานอยู่

ตัวอย่างเช่นยังไม่ได้ทดสอบอย่างสมบูรณ์และมีข้อแม้ที่ฉันไม่มี OS X เพื่อลองใช้หากคุณมีบน Linux:

alias ll='ls -lFA'

และบน Mac OS X:

alias ll='ls -lFAx'

(ที่-xทำให้ OS X lsทำสิ่งที่ GNU ทำตามค่าเริ่มต้น) จากนั้นพวกเขาสามารถรวมกันเป็นดังนี้:

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...

ความต้องการเพียงอย่างเดียวคือการuname -sทำงานในลักษณะเดียวกัน (ควรเนื่องจากทั้งสองระบบมีเหตุผล POSIX-y และuname -s เป็นสิ่งจำเป็นโดย POSIX (ขอบคุณMarcoสำหรับการชี้ให้เห็นนี้ )) และไวยากรณ์สำหรับเชลล์สคริปต์การแยกสาขา ขึ้นอยู่กับการเปรียบเทียบสตริงเหมือนกัน คุณสามารถทดสอบตามเกณฑ์อื่น ๆ เช่นกัน; เช่นคุณสามารถค้นหา / etc / lsb_release ตรวจสอบว่า / proc / sys / kernel / ostype มี "Linux" หรือการทดสอบอื่น ๆ ที่คุณสามารถทำได้


@RaphaelAhrens มันDarwinฉันเพิ่งตรวจสอบ
k0pernikus

@RaphaelAhrens อย่างที่ฉันเขียนฉันไม่มี OS X ที่จะลองทำสิ่งต่าง ๆ ดังนั้นฉันจึงเดาว่าจะแสดงความคิดมากกว่าที่จะใช้เวลามากกับรายละเอียดที่ไม่สำคัญซึ่ง OP สามารถค้นหาได้เล็กน้อย
CVn

Wikipedia to the rescue en.wikipedia.org/wiki/Unameถ้ามีคนต้องการทุบตี Windows หรือสิ่งอื่น ๆ
Raphael Ahrens

1
-oสวิตช์uname ไม่ใช่ POSIX และล้มเหลวในหลาย ๆ ระบบเช่น Solaris -sจำเป็นสำหรับ POSIX และวิธีที่เข้ากันได้มากที่สุด IEEE Std 1003.1
Marco

2
OSTYPEไม่สามารถใช้ได้ใน POSIX เชลล์ มันจะล้มเหลวตัวอย่างเช่นในการติดตั้ง FreeBSD ค่าเริ่มต้นและสามารถนำมาใช้เฉพาะในหรือ.bashrc .zshrcมันไม่ทำงานได้อย่างน่าเชื่อถือใน.profile, .aliasฯลฯ เนื่องจากเรากำลังพูดถึง compatibiliy นี่ผมแนะนำให้ไปทางที่ปลอดภัยแทนการพึ่งพาคุณลักษณะเปลือกโดยเฉพาะอย่างยิ่งที่ไม่ได้รับประกันว่าจะสามารถใช้ได้ในทุกระบบ
Marco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.