Apa perbedaan antara menggunakan terminal di Mac vs Linux? [Tutup]

89

Saya telah menggunakan Ubuntu selama empat tahun terakhir.
Saya memiliki pengetahuan dasar tentang perintah shell dan saya lebih suka bekerja di terminal daripada menggunakan GUI. Baru-baru ini saya mulai menggunakan Mac.

Saya sudah mencoba beberapa perintah terminal (yang saya gunakan di Ubuntu) di terminal Mac dan sepertinya merespons dengan cara yang hampir sama.

Apakah ada perbedaan signifikan dalam perintah yang saya gunakan, tugas yang mereka lakukan, atau lingkungan shell yang harus saya ketahui?

Dili
sumber
8
Saya ingin membuka kembali dan pindah ke pertukaran programmer.
Michael Durrant
1
Apakah ada daftar lengkap perintah terminal mac vs linux di mana pun di web?
jasonleonhard

Jawaban:

61

Jika Anda melakukan penginstalan baru atau bersih dari OS X versi 10.3 atau yang lebih baru, shell terminal pengguna default adalah bash.

Bash pada dasarnya adalah versi freeware GNU yang disempurnakan dari Bourne shell asli, sh. Jika Anda memiliki pengalaman sebelumnya dengan bash (seringkali merupakan default pada instalasi GNU / Linux), ini membuat pengalaman baris perintah OS X menjadi familiar, jika tidak pertimbangkan untuk mengganti shell Anda ke tcsh atau ke zsh, karena beberapa menganggap ini lebih ramah pengguna.

Jika Anda mengupgrade dari atau menggunakan OS X versi 10.2.x, 10.1.x, atau 10.0.x, shell pengguna default adalah tcsh, versi csh ('c-shell') yang ditingkatkan. Implementasi awal agak bermasalah dan sintaks pemrogramannya agak aneh sehingga mengembangkan rap yang buruk.

Masih ada beberapa perbedaan mendasar antara mac dan linux seperti yang dicantumkan dengan tepat oleh Gordon Davisson, misalnya tidak useradddi Mac dan ifconfigbekerja secara berbeda.

Tabel berikut berguna untuk mengetahui berbagai shell unix.

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

Anda mungkin juga menemukan panduan ini bermanfaat:

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

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

Pada catatan terakhir, saya menggunakan Linux (Ubuntu 11) dan Mac osX jadi saya menggunakan bash dan hal yang paling saya sukai adalah menyesuaikan file .bashrc (bersumber dari .bash_profileOSX) dengan alias, beberapa contoh di bawah ini. Saya sekarang menempatkan semua alias saya dalam file .bash_aliases terpisah dan menyertakannya dengan:

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

di file .bashrc atau .bash_profile.

Perhatikan bahwa ini adalah contoh perbedaan mac-linux karena di Mac Anda tidak dapat memiliki ekstensi--color=auto . Pertama kali saya melakukan ini (tanpa mengetahui) saya mendefinisikan ulang lsmenjadi tidak valid yang agak mengkhawatirkan sampai saya menghapusnya --auto-color!

Anda mungkin juga menemukan https://unix.stackexchange.com/q/127799/10043 berguna

# ~/.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'
Michael Durrant
sumber
1
Saya suka zshpenyelesaian kelas Java default.
Dave Newton
terima kasih telah mengingatkan saya bahwa warna berperilaku berbeda pada perintah linux dan macos ls. Saya menggunakan bashrc yang sama untuk keduanya dan perlu menemukan cara untuk menggunakan satu opsi ls secara bersyarat atau yang lain untuk memastikan ls selalu mendapat warna.
Bastian
Saya akan menggunakan ini untuk secara bersyarat menggunakan satu opsi ls atau yang lain sesuai dengan sistem operasi: _myos = "$ (uname)" dan kemudian case $ _myos di Linux) alias foo = '/ path / to / linux / bin / foo ';; FreeBSD | OpenBSD) alias foo = '/ jalur / ke / bsd / bin / foo' ;; *) ;; esac
Bastian
1
Bastian, Anda dapat memiliki warna untuk lsLinux ( --color=all) dan OSX ( -G) dengan yang berikut: ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
Michael Durrant
Tautan TerminalBasics.pdf tampaknya sudah mati. Apakah ini dokumen yang sama?
Plasma
29

Jawaban @Michael Durrant mampu menutupi shell itu sendiri, tetapi lingkungan shell juga menyertakan berbagai perintah yang Anda gunakan di shell dan ini akan serupa - tetapi tidak identik - antara OS X dan linux. Secara umum, keduanya akan memiliki perintah dan fitur inti yang sama (terutama yang ditentukan dalam standar Posix), tetapi banyak ekstensi akan berbeda.

Misalnya, sistem linux umumnya memiliki file useradd perintah untuk membuat pengguna baru, tetapi OS X tidak. Di OS X, Anda biasanya menggunakan GUI untuk membuat pengguna; jika Anda perlu membuatnya dari baris perintah, Anda menggunakan dscl(yang tidak dimiliki linux) untuk mengedit database pengguna (lihat di sini ). (Pembaruan: mulai di macOS High Sierra v10.13, Anda dapat menggunakan sysadminctl -addUsersebagai gantinya.)

Juga, beberapa perintah yang sama akan memiliki fitur dan opsi yang berbeda. Misalnya, linux umumnya menyertakan GNU sed, yang menggunakan -ropsi untuk memanggil ekspresi reguler yang diperluas; di OS X, Anda akan menggunakan -Eopsi untuk mendapatkan efek yang sama. Demikian pula, di linux yang mungkin Anda gunakan ls --color=autountuk mendapatkan keluaran berwarna; di macOS, padanan terdekatnya adalahls -G .

EDIT: Perbedaan lainnya adalah bahwa banyak perintah linux memungkinkan opsi ditentukan setelah argumennya (misalnya ls file1 file2 -l), sementara sebagian besar perintah OS X memerlukan opsi untuk didahulukan ( ls -l file1 file2).

Akhirnya, karena OS itu sendiri berbeda, beberapa perintah akhirnya berperilaku berbeda di antara OS. Misalnya, di linux yang mungkin Anda gunakan ifconfiguntuk mengubah konfigurasi jaringan Anda. Di OS X, ifconfigakan berfungsi (mungkin dengan sintaks yang sedikit berbeda), tetapi perubahan Anda kemungkinan besar akan ditimpa secara acak oleh daemon konfigurasi sistem; sebagai gantinya Anda harus mengedit preferensi jaringan dengan networksetup, dan kemudian membiarkan daemon konfigurasi menerapkannya ke status jaringan langsung.

Gordon Davisson
sumber
3
Poin bagus, Gordon! Saya akan memberi +1 meskipun saya juga punya jawaban;) - bukankah seharusnya saya mendapatkan kredibilitas untuk itu ?!
Michael Durrant
1
Terutama karena jawaban Anda sendiri adalah jawaban yang cukup bagus; Saya telah memberi Anda suara juga.
Gordon Davisson