使用Mac和Linux终端有什么区别?

95

我过去四年一直在使用Ubuntu操作系统。
我对Shell命令有基本的了解,而且更喜欢使用终端而非图形界面。最近我开始使用Mac系统。

我已经尝试在Mac终端中运行一些(我在Ubuntu上使用的)命令,似乎大多数情况下它们的反应都相同。

不知道在这些命令、它们执行的任务或者Shell环境方面是否存在重要的差异?


8
我希望重新开放并转移到程序员交流平台。 - Michael Durrant
2
在网上是否有一个全面的Mac vs Linux终端命令列表? - jasonleonhard
2个回答

63
如果您新安装或清除安装了OS X 10.3或更高版本,则默认用户终端 shell 是 bash。
Bash 本质上是原始 Bourne shell (sh) 的增强和 GNU 免费软件版。如果您之前有使用 bash 的经验 (通常是在 GNU/Linux 安装中的默认 shell),那么这会使得 OS X 命令行体验感到熟悉,否则考虑切换到 tcsh 或 zsh,因为一些人认为这些 shell 更加易用。
如果您从 OS X 10.2.x、10.1.x 或 10.0.x 升级或使用,则默认用户 shell 是 tcsh,它是 csh(“c-shell”)的增强版本。早期实现存在一些 bug,编程语法也有点奇怪,所以它声名狼藉。
仍然存在一些基本差异,如 Gordon Davisson 所列举的,例如 Mac 上没有 useradd,并且 ifconfig 的工作方式也不同。
以下表格对于了解各种 Unix shell 很有用。
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 OS X,因此我使用bash,并且我最喜欢的是通过自定义.bashrc文件来创建别名。以下是一些示例。 我现在将所有别名都放在单独的.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)",然后 case $_myos in Linux) alias foo='/path/to/linux/bin/foo';; FreeBSD|OpenBSD) alias foo='/path/to/bsd/bin/foo' ;; *) ;; esac - Bastian
1
Bastian,你可以在Linux(--color=all)和OSX(-G)中为ls设置颜色,方法如下:ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G' - Michael Durrant
TerminalBasics.pdf 链接 似乎已经无效。这个链接是同一个文档吗? - Plasma

32

@Michael Durrant的回答很好地涵盖了shell本身,但是shell环境还包括您在shell中使用的各种命令,这些命令将类似但不完全相同 - 在OS X和linux之间。总的来说,两者都将拥有相同的核心命令和功能(特别是在Posix标准中定义的那些),但许多扩展将是不同的。

例如,Linux系统通常有一个useradd命令来创建新用户,但OS X没有。在OS X上,通常使用GUI创建用户;如果需要从命令行创建它们,则使用dscl(Linux没有此命令)编辑用户数据库(请参见这里)。 (更新:从macOS High Sierra v10.13开始,您可以改用sysadminctl -addUser。)

另外,一些共同拥有的命令将具有不同的功能和选项。例如,Linux通常包含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也可以工作(可能需要略微不同的语法),但您的更改可能会被系统配置守护进程随机覆盖;相反,您应该使用networksetup 编辑网络首选项,然后让配置守护进程将其应用到实时网络状态。


3
很棒的见解,Gordon!虽然我也有答案,但我会点赞的;) - 难道我不能因为这个得到一些认可吗?! - Michael Durrant
1
特别是因为你的回答本身就很好,我也给了你一票。 - Gordon Davisson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接