在命令行上操作的越多,您就越会发现您使用的大多数命令只是可用命令的很小的子集。大多数任务都是习惯性的,您可能每天都以相同的方式运行这些任务。
虽然许多最常见的命令实用程序的制造商试图通过使用缩写名称来消除无关的输入(想想通过输入“ls”而不是“list”和“cd”而不是“change-directory”,您每天可以节省多少次击键) ”),这些并不是普遍存在的。此外,许多人每次运行命令时总是启用相同的几个选项。
幸运的是,bash 允许我们通过使用别名和 shell 函数来创建自己的快捷方式和节省时间。在本指南中,我们将讨论如何利用它们,并为您提供一些有用的示例,帮助您朝着正确的方向开始。
在 bash 中声明别名非常简单。非常简单,您现在就应该尝试一下。
您只需在命令行中输入别名即可声明其持续时间与您的 shell 会话一样长。语法如下:
-
alias alias_name="command_to_run"
请注意,相邻元素和等号之间没有间距。这不是可选的。这里的空格会破坏命令。
现在让我们创建一个通用的 bash 别名。许多人经常使用的一个惯用命令短语是ls -lha
or ls -lhA
(第二个省略当前目录和父目录列表)。我们可以创建一个快捷方式,可以称为ll
通过输入:
alias ll="ls -lhA"
现在,我们可以输入ll
我们将以长格式获取当前目录的列表,包括隐藏目录:
ll
-rw-r--r-- 1 root root 3.0K Mar 20 18:03 .bash_history
-rw-r--r-- 1 root root 3.1K Apr 19 2012 .bashrc
drwx------ 2 root root 4.0K Oct 24 14:45 .cache
drwx------ 2 root root 4.0K Mar 20 18:00 .gnupg
-rw-r--r-- 1 root root 0 Oct 24 17:03 .mysql_history
-rw-r--r-- 1 root root 140 Apr 19 2012 .profile
drwx------ 2 root root 4.0K Oct 24 14:21 .ssh
-rw------- 1 root root 3.5K Mar 20 17:24 .viminfo
如果你想摆脱别名,只需使用unalias
命令:
unalias ll
该别名现已删除。
您可以通过传递以下命令来列出所有配置的别名alias
不带任何参数的命令:
alias
暂时绕过别名(假设我们别名ls
to ls -a
),我们可以输入:
\ls
这将调用在我们的路径中找到的正常命令,而不使用别名版本。
假设您没有取消设置,ll
别名在整个当前 shell 会话中都可用,但是当您打开新的终端窗口时,该别名将不可用。
为了使其持久化,我们需要将其添加到 shell 会话开始时读取的各种文件之一中。流行的选择是~/.bashrc
and ~/.bash_profile
。我们只需要打开文件并在其中添加别名:
nano ~/.bashrc
在底部或您想要的任何位置,添加您在命令行上添加的别名。请随意添加一条注释,声明整个部分专门用于 bash 别名:
#########
# Aliases
#########
alias ll="ls -lhA"
该别名或变体实际上可能已经存在于您的文件中。许多发行版附带了一组标准 bash 配置文件和一些有用的别名。
保存并关闭文件。您添加的任何别名都将在您下次启动新的 shell 会话时可用。要将您在文件中所做的任何更改读入您的currentsession,只需告诉 bash 现在重新读取文件:
source ~/.bashrc
现在您已经知道如何创建自己的别名了,让我们来谈谈一些可能对您有用的流行别名。这些可以在整个网络中找到,有些也可能包含在您的发行版的默认 bash 配置中。
当您应用某些格式和选项时,许多最简单的 Linux 命令会更加有用。
我们讨论了一个ls
上面的示例,但您可能会发现许多其他示例。
Make ls
默认情况下,按列显示并带有文件类型指示符(以“/”等结束目录):
alias ls="ls -CF"
我们还可以预见一些拼写错误,使其调用正确的命令:
alias sl="ls"
我们还创建一个别名来将输出传输到less
用于查看长格式的大型目录列表:
alias lsl="ls -lhFA | less"
我们如何偏离ls
并尝试一些有用的命令cd
.
即使您忘记了空格,该目录也会更改为您的父目录:
alias cd..="cd .."
您还可以剪掉cd
部分完全通过为..
:
alias ..="cd .."
通过设置此别名,我们可以轻松找到当前目录中的文件:
alias fhere="find . -name "
我们的一些监控和系统统计命令怎么样?我每次都使用相同的选项来调用它们,所以我不妨创建一些别名。
这将以人类可读的单位列出我们的磁盘使用情况,包括文件系统类型,并在底部打印总计:
alias df="df -Tha --total"
我们不妨为我们的首选添加一个别名du
输出还有:
alias du="du -ach | sort -h"
让我们继续朝着同一个方向前进free
输出更人性化:
alias free="free -mt"
我们可以利用列表流程表做很多事情。让我们从设置默认输出开始:
alias ps="ps auxf"
让我们的进程表可搜索怎么样?我们可以创建一个别名,在我们的进程中搜索我们将传递的参数:
alias psg="ps aux | grep -v grep | grep -i -e VSZ -e"
现在,当我们使用我们正在寻找的进程名称作为参数来调用它时,我们将得到一个漂亮、紧凑的输出:
psg bash
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1001 5227 0.0 0.0 26320 3376 pts/0 Ss 16:29 0:00 bash
一种常见的选择是mkdir
我们经常使用的命令是-p
标记以创建任何必要的父目录。我们可以将其设为默认值:
alias mkdir="mkdir -p"
我们可能想添加一个-v
标记在上面,以便我们知道每个目录的创建,这可以帮助我们快速识别是否有导致意外目录分支的拼写错误:
alias mkdir="mkdir -pv"
从互联网下载文件时wget
,在几乎所有情况下,您都希望通过-c
标记以便在出现问题时继续下载。我们可以这样设置:
alias wget="wget -c"
我们可以像使用 grep 一样轻松地搜索历史记录history
命令的输出。有时这比使用 CTRL-R 反向搜索更有用,因为它为您提供了命令编号,以便随后执行更复杂的调用:
alias histg="history | grep"
我有一些系统工具,我更喜欢从标准版本升级到更复杂的工具。这些仅在您下载了所需的实用程序后才起作用,但它们可能非常有帮助。请记住,这些可能会影响您的其他别名。
这个取代了传统的top
具有增强版本的命令,更易于查看,并且可以轻松排序、搜索和滚动:
alias top="htop"
以类似的方式,ncdu
可以下载命令,该命令在交互式 ncurses 显示中显示文件和目录大小,您可以浏览并使用该命令来执行简单的文件操作:
alias du="ncdu"
有一个升级的实用程序df
以及这就是所谓的pydf
。它提供彩色输出和基于文本的使用栏。如果我们有这个实用程序,我们可以默认使用它:
alias df="pydf"
当您位于使用 NAT 的路由器后面时,您是否曾经需要通过命令行获取公共 IP 地址?像这样的东西可能会有用:
alias myip="curl http://ipecho.net/plain; echo"
出于我自己的目的,我喜欢将文章上传的图像优化为 690px 或更小,因此我使用 ImageMagick 包(sudo apt-get install imagemagick
如果尚不可用),其中包含一个名为mogrify
就是这样做的。我的里面有这个命令~/.bashrc
file:
alias webify="mogrify -resize 690\> *.png"
这将调整当前目录中所有 PNG 图像的大小,前提是它们的宽度超过 690 像素。
如果我必须将它们上传到服务器,我可以使用sftp
连接并自动更改到特定目录:
-
alias upload="sftp username@server.com</^>:/path/to/upload/directory<^>
尽管别名实现起来既快捷又容易,但它们的范围相当有限。您会发现,当您尝试将命令链接在一起时,您无法很好地访问运行时给出的参数等。别名有时也可能非常慢,因为它们是在所有函数之后读取的。
有一个更强大的别名替代方案,可以帮助您弥合 bash 别名和完整 shell 脚本之间的差距。这些称为 shell 函数。它们的工作方式与别名几乎相同,但更具编程性并以标准方式接受输入。
我们不会在这里详细讨论,因为它们可以在许多复杂的情况下使用,并且 bash 是一种完整的脚本语言,但我们将介绍一些基本示例。
对于初学者来说,有两种基本方法可以声明 bash 语法。第一个使用的是function
命令看起来像这样:
-
function function_name {
- command1
- <^>command2</^>
-
}
另一种语法使用一组更像“C”的括号:
-
function_name () {
- command1
- command2
-
}
我们可以将第二种形式压缩为一行并用分号分隔命令。一个分号must也在最后一个命令之后:
-
function_name () { command1; command2; }
让我们首先演示一个非常有用的 bash 函数。这将创建一个目录,然后立即移至该目录。这通常正是我们创建新目录时所采取的顺序:
mcd () {
mkdir -p $1
cd $1
}
现在,当我们使用这个函数而不是常规函数时mkdir
创建后自动切换到目录的命令:
mcd test
pwd
/home/demouser/test
您会看到的一项很酷的功能是extract
功能。它结合了许多实用程序,允许您解压缩几乎任何压缩文件格式。有很多变体,但这个来自here:
function extract {
if [ -z "$1" ]; then
# display usage if no parameters given
echo "Usage: extract <path/file_name>.<zip|rar|bz2|gz|tar|tbz2|tgz|Z|7z|xz|ex|tar.bz2|tar.gz|tar.xz>"
echo " extract <path/file_name_1.ext> [path/file_name_2.ext] [path/file_name_3.ext]"
return 1
else
for n in $@
do
if [ -f "$n" ] ; then
case "${n%,}" in
*.tar.bz2|*.tar.gz|*.tar.xz|*.tbz2|*.tgz|*.txz|*.tar)
tar xvf "$n" ;;
*.lzma) unlzma ./"$n" ;;
*.bz2) bunzip2 ./"$n" ;;
*.rar) unrar x -ad ./"$n" ;;
*.gz) gunzip ./"$n" ;;
*.zip) unzip ./"$n" ;;
*.z) uncompress ./"$n" ;;
*.7z|*.arj|*.cab|*.chm|*.deb|*.dmg|*.iso|*.lzh|*.msi|*.rpm|*.udf|*.wim|*.xar)
7z x ./"$n" ;;
*.xz) unxz ./"$n" ;;
*.exe) cabextract ./"$n" ;;
*)
echo "extract: '$n' - unknown archive method"
return 1
;;
esac
else
echo "'$n' - file does not exist"
return 1
fi
done
fi
}
该函数采用第一个参数,并根据使用的文件扩展名调用适当的实用程序。
希望本指南能给您一些创建自己的别名和 bash 函数的灵感。广泛使用这些可以帮助您在 shell 中度过更愉快、更轻松的时光。
请记住,要警惕重新定义具有潜在破坏性行为的现有命令。即使做相反的操作并将命令别名为更安全的变体(例如,在递归删除之前总是要求确认)一旦您开始依赖它,当您第一次使用没有它的系统时,也会给您带来麻烦。
要找到可能适合为其创建别名的候选者,最好在您的历史记录中搜索最常用的命令。一行从here允许我们查看最常用的命令:
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10
1 247 24.7% cd
2 112 11.2% vim
3 90 9% exit
4 72 7.2% ls
5 70 7% xset
6 56 5.6% apt-get
7 40 4% vlc
8 40 4% rm
9 38 3.8% screen
10 27 2.7% htop
我们可以轻松地使用此列表作为我们经常使用的命令的起点。在评论部分,请随意分享您最喜欢的 bash 别名和函数:
作者:Justin Ellingwood