อะไรคือความแตกต่างระหว่างการใช้ Terminal บน mac vs linux? [ปิด]


89

ฉันใช้ Ubuntu มาสี่ปีแล้ว
ฉันมีความรู้พื้นฐานเกี่ยวกับคำสั่งเชลล์และฉันชอบทำงานในเทอร์มินัลมากกว่าใช้ GUI ฉันเพิ่งเริ่มใช้ Mac

ฉันได้ลองใช้คำสั่งเทอร์มินัลสองสามคำ (ที่ฉันใช้บน Ubuntu) ในเทอร์มินัล Mac และดูเหมือนว่าจะตอบสนองในลักษณะเดียวกันเป็นส่วนใหญ่

มีความแตกต่างอย่างมีนัยสำคัญในคำสั่งที่ฉันใช้งานที่ทำหรือสภาพแวดล้อมเชลล์ที่ฉันควรทราบหรือไม่


8
ฉันต้องการเปิดใหม่และย้ายไปแลกเปลี่ยนโปรแกรมเมอร์
Michael Durrant

1
มีรายการคำสั่งเทอร์มินัล mac vs linux ที่ครอบคลุมทุกที่บนเว็บหรือไม่?
jasonleonhard

คำตอบ:


61

หากคุณทำการติดตั้ง OS X เวอร์ชัน 10.3 ใหม่หรือใหม่กว่าทั้งหมดเทอร์มินัลเชลล์ของผู้ใช้เริ่มต้นจะเป็น bash

Bash เป็นเวอร์ชันฟรีแวร์ที่ได้รับการปรับปรุงและ GNU ของ Bourne shell ดั้งเดิม sh. หากคุณมีประสบการณ์ในการใช้ bash มาก่อน (มักจะเป็นค่าเริ่มต้นในการติดตั้ง GNU / Linux) สิ่งนี้จะทำให้ประสบการณ์บรรทัดคำสั่ง OS X คุ้นเคยมิฉะนั้นให้ลองเปลี่ยนเชลล์ของคุณเป็น tcsh หรือ zsh เนื่องจากบางคนพบว่าสิ่งเหล่านี้ใช้งานง่ายกว่า

หากคุณอัปเกรดหรือใช้ OS X เวอร์ชัน 10.2.x, 10.1.x หรือ 10.0.x เชลล์ผู้ใช้เริ่มต้นคือ tcsh ซึ่งเป็นเวอร์ชันปรับปรุงของ csh ('c-shell') การใช้งานในช่วงแรกนั้นค่อนข้างมีข้อผิดพลาดและไวยากรณ์การเขียนโปรแกรมค่อนข้างแปลกดังนั้นจึงพัฒนาแร็พที่ไม่ดี

ยังคงมีความแตกต่างพื้นฐานบางประการระหว่าง mac และ linux เนื่องจาก Gordon Davisson แสดงรายการที่เหมาะสมเช่นไม่มีuseraddบน Mac และifconfigทำงานแตกต่างกัน

ตารางต่อไปนี้มีประโยชน์ในการทำความรู้จักกับเปลือกหอยต่างๆ

sh      The original Bourne shell   Present on every unix system 
ksh     Original Korn shell         Richer shell programming environment than sh 
csh     Original C-shell            C-like syntax; early versions buggy 
tcsh    Enhanced C-shell            User-friendly and less buggy csh implementation 
bash    GNU Bourne-again shell      Enhanced and free sh implementation 
zsh     Z shell                     Enhanced, user-friendly ksh-like shell

คุณอาจพบว่าคำแนะนำเหล่านี้มีประโยชน์:

http://homepage.mac.com/rgriff/files/TerminalBasics.pdf

http://guides.macrumors.com/Terminal
http://www.ofb.biz/safari/article/476.html

ในบันทึกสุดท้ายฉันใช้ Linux (Ubuntu 11) และ Mac osX ดังนั้นฉันจึงใช้ bash และสิ่งที่ฉันชอบมากที่สุดคือการปรับแต่งไฟล์. bashrc (ที่มาจาก.bash_profileบน OSX) ด้วยนามแฝงตัวอย่างด้านล่าง ตอนนี้ฉันวางนามแฝงทั้งหมดไว้ในไฟล์. bash_aliases แยกต่างหากและรวมไว้กับ:

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

ในไฟล์. bashrc หรือ. bash_profile

โปรดทราบว่านี่เป็นตัวอย่างของความแตกต่างของ mac-linux เนื่องจากบน Mac คุณไม่มีไฟล์--color=auto . ครั้งแรกที่ฉันทำสิ่งนี้ (โดยไม่รู้ตัว) ฉันนิยามใหม่lsว่าไม่ถูกต้องซึ่งค่อนข้างน่าตกใจจนกระทั่งฉันลบออก--auto-color!

คุณอาจพบว่าhttps://unix.stackexchange.com/q/127799/10043มีประโยชน์

# ~/.bash_aliases
# ls variants
#alias l='ls -CF' 
alias la='ls -A' 
alias l='ls -alFtr' 
alias lsd='ls -d .*' 
# Various
alias h='history | tail'
alias hg='history | grep'
alias mv='mv -i' 
alias zap='rm -i'
# One letter quickies:
alias p='pwd'
alias x='exit'
alias {ack,ak}='ack-grep'
# Directories
alias s='cd ..'
alias play='cd ~/play/'
# Rails
alias src='script/rails console'
alias srs='script/rails server'
alias raked='rake db:drop db:create db:migrate db:seed' 
alias rvm-restart='source '\''/home/durrantm/.rvm/scripts/rvm'\'''
alias rrg='rake routes | grep '
alias rspecd='rspec --drb '
#
# DropBox - syncd
WORKBASE="~/Dropbox/97_2012/work"
alias work="cd $WORKBASE"
alias code="cd $WORKBASE/ror/code"
#
# DropNot - NOT syncd !
WORKBASE_GIT="~/Dropnot"
alias {dropnot,not}="cd $WORKBASE_GIT"
alias {webs,ww}="cd $WORKBASE_GIT/webs"
alias {setups,docs}="cd $WORKBASE_GIT/setups_and_docs"
alias {linker,lnk}="cd $WORKBASE_GIT/webs/rails_v3/linker"
#
# git
alias {gsta,gst}='git status' 
# Warning: gst conflicts with gnu-smalltalk (when used).
alias {gbra,gb}='git branch'
alias {gco,go}='git checkout'
alias {gcob,gob}='git checkout -b '
alias {gadd,ga}='git add '
alias {gcom,gc}='git commit'
alias {gpul,gl}='git pull '
alias {gpus,gh}='git push '
alias glom='git pull origin master'
alias ghom='git push origin master'
alias gg='git grep '
#
# vim
alias v='vim'
#
# tmux
alias {ton,tn}='tmux set -g mode-mouse on'
alias {tof,tf}='tmux set -g mode-mouse off'
#
# dmc
alias {dmc,dm}='cd ~/Dropnot/webs/rails_v3/dmc/'
alias wf='cd ~/Dropnot/webs/rails_v3/dmc/dmWorkflow'
alias ws='cd ~/Dropnot/webs/rails_v3/dmc/dmStaffing'

1
ฉันชอบการzshจบคลาส Java เริ่มต้น
Dave Newton

ขอบคุณที่เตือนฉันว่าสีทำงานแตกต่างกันในคำสั่ง linux และ macos ls ฉันใช้ bashrc เดียวกันสำหรับทั้งคู่และต้องหาวิธีใช้ตัวเลือก ls หนึ่งตัวหรืออีกทางหนึ่งตามเงื่อนไขเพื่อให้แน่ใจว่า ls ได้รับสี
Bastian

ฉันจะใช้สิ่งนี้เพื่อใช้ตัวเลือก ls แบบมีเงื่อนไขหรือตัวเลือกอื่น ๆ ตามระบบปฏิบัติการ: _myos = "$ (uname)" แล้วกรณี $ _myos ใน Linux) alias foo = '/ path / to / linux / bin / foo ';; FreeBSD | OpenBSD) นามแฝง foo = '/ path / to / bsd / bin / foo' ;; *) ;; esac
Bastian

1
Bastian คุณสามารถมีสีได้lsทั้งใน Linux ( --color=all) และ OSX ( -G) ดังต่อไปนี้: ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
Michael Durrant

ลิงก์ TerminalBasics.pdfดูเหมือนจะตาย คือนี้เอกสารเดียวกันได้หรือไม่
Plasma

29

คำตอบของ @ Michael Durrant ครอบคลุมเชลล์ตัวเองอย่างชัดเจน แต่สภาพแวดล้อมเชลล์ยังรวมถึงคำสั่งต่างๆที่คุณใช้ในเชลล์และสิ่งเหล่านี้จะคล้ายกัน - แต่ไม่เหมือนกัน - ระหว่าง OS X และ linux โดยทั่วไปทั้งสองจะมีคำสั่งและคุณสมบัติหลักเหมือนกัน (โดยเฉพาะที่กำหนดไว้ในมาตรฐาน Posix) แต่ส่วนขยายจำนวนมากจะแตกต่างกัน

ตัวอย่างเช่นโดยทั่วไประบบ linux จะมีuseraddคำสั่งให้สร้างผู้ใช้ใหม่ แต่ OS X ไม่มี ใน OS X โดยทั่วไปคุณจะใช้ GUI เพื่อสร้างผู้ใช้ หากคุณต้องการสร้างจากบรรทัดคำสั่งคุณใช้dscl(ซึ่ง linux ไม่มี) เพื่อแก้ไขฐานข้อมูลผู้ใช้ (ดูที่นี่ ) (อัปเดต: เริ่มต้นใน macOS High Sierra v10.13 คุณสามารถใช้sysadminctl -addUserแทนได้)

นอกจากนี้คำสั่งบางคำที่มีเหมือนกันจะมีคุณสมบัติและตัวเลือกที่แตกต่างกัน ตัวอย่างเช่นโดยทั่วไป linuxes จะรวม GNU sedซึ่งใช้-rตัวเลือกในการเรียกใช้นิพจน์ทั่วไปที่ขยาย บน OS X คุณจะต้องใช้-Eตัวเลือกเพื่อให้ได้เอฟเฟกต์เดียวกัน ในทำนองเดียวกันใน linux คุณอาจใช้ls --color=autoเพื่อให้ได้ผลลัพธ์ที่เป็นสี บน MacOS ls -Gเทียบเท่าที่ใกล้ที่สุดคือ

แก้ไข: ความแตกต่างอีกประการหนึ่งคือคำสั่ง linux จำนวนมากอนุญาตให้ระบุตัวเลือกหลังจากอาร์กิวเมนต์ (เช่นls file1 file2 -l) ในขณะที่คำสั่ง OS X ส่วนใหญ่ต้องการตัวเลือกที่ต้องมาก่อนอย่างเคร่งครัด ( ls -l file1 file2)

ในที่สุดเนื่องจากระบบปฏิบัติการนั้นแตกต่างกันคำสั่งบางคำสั่งจึงทำงานแตกต่างกันระหว่างระบบปฏิบัติการ ตัวอย่างเช่นบน linux คุณอาจใช้ifconfigเพื่อเปลี่ยนการกำหนดค่าเครือข่ายของคุณ บน OS X ifconfigจะใช้งานได้ (อาจมีไวยากรณ์ที่แตกต่างกันเล็กน้อย) แต่การเปลี่ยนแปลงของคุณน่าจะถูกเขียนทับแบบสุ่มโดย daemon การกำหนดค่าระบบ คุณควรแก้ไขการกำหนดลักษณะเครือข่ายด้วยnetworksetupจากนั้นให้ config daemon นำไปใช้กับสถานะเครือข่ายสด


3
คะแนนที่ดี Gordon! ฉันจะ +1 แม้ว่าฉันจะมีคำตอบด้วยก็ตาม;) - ฉันไม่ควรได้รับเครดิตสำหรับสิ่งนั้นหรือ
Michael Durrant

1
โดยเฉพาะอย่างยิ่งเนื่องจากคุณเป็นคำตอบที่ค่อนข้างดีในตัวของมันเอง ฉันให้คะแนนคุณเช่นกัน
Gordon Davisson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.