Jakie są różnice między używaniem terminala na Macu a Linuksem? [Zamknięte]

89

Używam Ubuntu od czterech lat.
Mam podstawową wiedzę na temat poleceń powłoki i wolę pracować w terminalu niż przy użyciu GUI. Ostatnio zacząłem używać komputera Mac.

Wypróbowałem kilka poleceń terminalowych (których używam na Ubuntu) w terminalu Mac i wydaje się, że reagują w większości w ten sam sposób.

Czy są jakieś znaczące różnice w poleceniach, których używam, zadaniach, które wykonują lub środowisku powłoki, o których powinienem wiedzieć?

Dili
źródło
8
Chciałbym ponownie otworzyć i przejść do wymiany programistów.
Michael Durrant
1
Czy w dowolnym miejscu w sieci istnieje pełna lista poleceń terminala Mac i Linux?
jasonleonhard

Odpowiedzi:

61

Jeśli wykonałeś nową lub czystą instalację systemu OS X w wersji 10.3 lub nowszej, domyślną powłoką terminala użytkownika jest bash.

Bash jest zasadniczo ulepszoną i darmową wersją GNU oryginalnej powłoki Bourne'a, sh. Jeśli masz wcześniejsze doświadczenie z bash (często domyślne w instalacjach GNU / Linux), sprawia to, że obsługa wiersza poleceń OS X jest znajoma, w przeciwnym razie rozważ zmianę powłoki na tcsh lub zsh, ponieważ niektórzy uważają je za bardziej przyjazne dla użytkownika.

Jeśli dokonałeś aktualizacji lub używasz OS X w wersji 10.2.x, 10.1.x lub 10.0.x, domyślną powłoką użytkownika jest tcsh, ulepszona wersja csh („c-shell”). Wczesne implementacje były trochę błędne, a składnia programowania nieco dziwna, więc rozwinęła się kiepski rap.

Nadal istnieją pewne fundamentalne różnice między mac i linuxem, które Gordon Davisson tak trafnie wymienia, na przykład nie useraddna Macu i ifconfigdziała inaczej.

Poniższa tabela jest przydatna do poznania różnych powłok uniksowych.

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

Przydatne mogą być również te przewodniki:

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

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

Na koniec używam Linuksa (Ubuntu 11) i Mac OSX, więc używam basha i najbardziej lubię dostosowywanie .bash_profilepliku .bashrc (źródło z OSX) z aliasami, kilka przykładów poniżej. Teraz umieściłem wszystkie moje aliasy w oddzielnym pliku .bash_aliases i dołączam go do:

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

w pliku .bashrc lub .bash_profile.

Zauważ, że jest to przykład różnicy między systemem Mac a--color=auto linux, ponieważ na komputerze Mac nie możesz mieć rozszerzenia . Za pierwszym razem, gdy to zrobiłem (nie wiedząc), przedefiniowałem lsto jako nieważne, co było trochę niepokojące, dopóki nie usunąłem --auto-color!

Przydatne może być również 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'
Michael Durrant
źródło
1
Podoba mi się zshdomyślne uzupełnianie klas Java.
Dave Newton
dzięki za przypomnienie mi, że kolor zachowuje się inaczej na komendzie Linux i macOS ls. Używam tego samego bashrc dla obu i muszę znaleźć sposób na warunkowe użycie jednej opcji ls lub drugiej, aby upewnić się, że ls zawsze otrzymuje kolory.
Bastian
Zamierzam użyć tego do warunkowego użycia jednej lub drugiej opcji ls w zależności od systemu operacyjnego: _myos = "$ (uname)", a następnie przypadek $ _myos w Linuksie) alias foo = '/ path / to / linux / bin /bla';; FreeBSD | OpenBSD) alias foo = '/ path / to / bsd / bin / foo' ;; *) ;; esac
Bastian,
1
Bastianie, możesz mieć kolor lszarówno w Linuksie ( --color=all), jak i OSX ( -G) z następującymi ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
elementami
Wydaje się, że link TerminalBasics.pdf jest martwy. Czy to ten sam dokument?
Plazma
29

Odpowiedź @Michaela Durranta dobrze obejmuje samą powłokę, ale środowisko powłoki zawiera również różne polecenia, których używasz w powłoce, a te będą podobne - ale nie identyczne - między OS X i Linux. Ogólnie rzecz biorąc, oba będą miały te same podstawowe polecenia i funkcje (szczególnie te zdefiniowane w standardzie Posix), ale wiele rozszerzeń będzie innych.

Na przykład systemy linux zazwyczaj mają useraddpolecenie tworzenia nowych użytkowników, ale OS X nie. W systemie OS X generalnie używasz GUI do tworzenia użytkowników; jeśli chcesz je utworzyć z wiersza poleceń, użyj dscl(czego linux nie ma) do edycji bazy danych użytkowników (patrz tutaj ). (Aktualizacja: począwszy od macOS High Sierra v10.13, możesz użyć sysadminctl -addUserzamiast tego).

Ponadto niektóre wspólne polecenia będą miały inne funkcje i opcje. Na przykład linuksy generalnie zawierają GNU sed, które używa -ropcji wywoływania rozszerzonych wyrażeń regularnych; w systemie OS X użyjesz -Eopcji, aby uzyskać ten sam efekt. Podobnie w Linuksie możesz użyć ls --color=autodo uzyskania kolorowego wyjścia; w systemie macOS najbliższym odpowiednikiem jest ls -G.

EDYCJA: Inną różnicą jest to, że wiele poleceń linuksa pozwala na określenie opcji po ich argumentach (np. ls file1 file2 -l), Podczas gdy większość poleceń OS X wymaga, aby opcje były ustawione na pierwszym miejscu ( ls -l file1 file2).

Wreszcie, ponieważ sam system operacyjny jest inny, niektóre polecenia zachowują się inaczej w różnych systemach operacyjnych. Na przykład w systemie Linux prawdopodobnie użyłbyś ifconfigdo zmiany konfiguracji sieci. W OS X ifconfigzadziała (prawdopodobnie z nieco inną składnią), ale Twoje zmiany prawdopodobnie zostaną losowo nadpisane przez demona konfiguracji systemu; Zamiast tego powinieneś edytować preferencje sieciowe za pomocą networksetup, a następnie pozwolić demonowi konfiguracji zastosować je do stanu sieci na żywo.

Gordon Davisson
źródło
3
Świetne punkty Gordon! Dam +1, mimo że mam też odpowiedź;) - czy nie powinienem dostać za to jakiegoś kredytu ?!
Michael Durrant
1
Zwłaszcza, że ​​twoja odpowiedź sama w sobie jest całkiem dobra; Również oddałem ci głos.
Gordon Davisson