为什么我的经验(主要是 Linux,很少遇到 FreeBDS)的大多数 *NIX 命令都有如此“疯狂”(非直观)的默认行为,即与“等效” GUI 操作非常不同。
最明显的例子是文件复制命令,cp
默认情况下,Linux 上的命令 (1) 不会递归复制目录(对于之前使用 GUI 的人来说,这显然违反直觉,因为 GUI 中的复制/粘贴会复制目录及其中的所有内容)和 (2) 遵循 simlinks (!!),而不是直接复制(同样,任何 GUI 用户都会期望如此)。所以cp
我认为默认的“合理”版本应该是这样的:cp -r
。
(再次强调,这不是只使用过 GUI 的人独有的“偏见”。copy
例如,DOS 命令执行的操作与您预期的一样,相当于cp -r
或cp -ra
...)
另一个明显的例子是,任何非 shell 极客都会认为rm
whenrm -ri
是默认值。
90% 的 *NIX 命令都是如此,通过添加更多选项,您可以获得直观期望的默认设置。高级用户期望的默认设置与新手用户所期望的设置不同,因为很明显,99% 的时间和就是您所需要的。这并不意味着为了向后cp
兼容rm
,cp -r
事情rm -r
只需要保持这种状态,因为您可以创建一个新的 shell 并保留#/usr/bin/oldshell
或保留旧 shell 中的某些内容。
所以,问题又来了,为什么默认的 *NIX shell 命令选项/开关与您直观期望的相差如此之远?在哪里可以找到事物现状的历史论据(即使出于轶事目的)以及除了令人讨厌的向后兼容性之外还有什么原因导致当前的状况?
成立这在 unix.stackexchange 上实际上回答了我的很多问题......
答案1
命令完全按照预期执行。您可以通过查看该命令的手册页来了解对命令的合理期望。
例如
男人cp: -i, --覆盖前交互提示(覆盖先前的 -n 选项)
如果你发现自己认为某些选项总是有用的,那么有多种方法可以坚持你的选择。例如,你可以输入:
alias rm="rm -i"
alias cp="cp -r"
但这只会持续到您注销为止。要使这些选项永久生效,您可以将这些别名放在每次登录时由您的 shell 读取的文件中。如果您运行 bash,您可以将启动命令放在 ~/.bashrc 中。通常,~/.profile 也是放置别名的好地方。
就 shell 和命令行实用程序而言,当前的状况远非令人讨厌。使用终端而不是图形浏览器的最初冲击可能会让您感到困惑,甚至有些愤怒,但几年之后,您就会非常习惯它,并会回想起您曾经认为 GUI 浏览器是“当前状况”的时光。
为了表示善意,也为了欢迎您来到命令行界面的世界,我将向您介绍我最喜欢的几个别名。我会告诉您,cp -i 和 rm -i 最好作为默认命令,因为这样很容易犯错误并无意中删除大量文件。但我不同意使用递归选项。
# basic file manipulation, etc
alias cd....='cd ../..'
alias cd...='cd ../..'
alias cd..='cd ..'
alias cd.='cd .'
alias cd~='cd ~'
alias ....='cd ../..'
alias ...='cd ../..'
alias ..='cd ..'
alias ~='cd ~'
alias ls='ls --color=auto'
alias l='ls -CF'
alias l1='ls -1'
alias ll='ls -l'
alias lla='ls -la'
alias la='ls -a'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias mc='mv -i'
alias md="mkdir"
alias rd="rmdir"
alias less="less -i"
alias bc="bc -q"
alias KA="killall"
alias swipe='screen -wipe'
alias sdr='screen -dR $1'
# and some functions:
spelling () { echo $@ | LC_ALL=en_US aspell -a; }
google-search () {
BROWSER="firefox '%s' &"
args="${@}";
args=`echo $args | sed 's/ /%20/g'`;
url="https://www.google.no/search?hl=en&um=1&sa=1&q=";
printf "$BROWSER\n" "$url$args" | sh
}