Zsh 开发指南(第十六篇 alias 和 eval 的用法)

导读

alias(别名)在 shell 中是很是经常使用的,它主要用于给命令起别名,简化输入。但主要用于交互场景,在脚本中基本用不到。eval 是一个很是强大的命令,它的功能是将字符串解析成代码再执行,但也会额外增长不少复杂性,非必要场景尽可能少用。alias 和 eval 看起来好像没什么关系,但功能上有类似之处,因此放在一块儿讲。git

alias

最典型的例子是将 ls -l 简化成 ll:github

% alias ll='ls -l'
% ll
total 0
drwx------ 0 goreliu goreliu 512 Aug 31 13:55 tmux-1000
drwxr-xr-x 0 goreliu goreliu 512 Aug 31 13:37 yaourt-tmp-goreliu

alias 的效果至关于直接将字符串替换过来,比较好理解。shell

# 直接运行 alias,会列出全部的 alias
% alias
ll='ls -l'
lla='ls -F --color --time-style=long-iso -lA'
...

这样的 alias 只有在行首出现时,才会被解析。但 zsh 中还有一种功能更强大的全局 alias,不在行首也能被解析:bash

% alias -g G='| grep'

% ls G tmux
tmux-1000

但这样须要格外注意可能致使的反作用,好比我想建立一个名为 G 的文件:微信

% touch G
touch: missing file operand
Try 'touch --help' for more information.
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

结果 G 被替换了,只能在 G 两边加引号。ide

若是全局 alias 没用好,可能致使灾难性的后果,好比误删重要文件(像把某个全局 alias 传给 rm 后,刚好删除了 alias 字符串中的某些文件),因此须要执行权衡后再使用,而且用的时候要多加注意。ui

eval

eval 的功能是将字符串做为代码来执行。看上去好像很简单,但实际涉及很复杂的内容,主要是符号转义致使的语义问题。指针

在 bash 中,eval 的一个重要的使用场景是将变量的值当变量名,而后取它的变量值,相似于 c 语言中指向变量的指针:code

% str1=str2
% str2=abc
% eval echo \$$str1
abc

注意这里有一个 和两个 $,缘由是第二个 $ 是和平时同样,正常取 str1 的值的,而第一个 $ 须要转义,由于它要在 eval 执行的过程当中取 str2 的值,不能如今就展开。orm

这个用法很容易出问题,并且可读性不好。幸亏 zsh 中无需这么用,有更好的办法:

% str1=str2
% str2=abc
% echo ${(P)str1}
abc

(P) 专门用于这种场景,不须要再去转义 $。

此外 eval 有时也用来动态执行代码,好比一个脚本接受用户的输入,而这输入也是一段脚本代码,就能够用 eval 来运行它。但这种用法是极其危险的,由于脚本中可能有各类危险操做,并且 shell 的语法很灵活,很难经过静态扫描的方法判断是否有危险操做。不可靠的代码根本不该该去运行。即便必定要运行,也能够先写到文件里再运行,避免传过来的代码影响到自身的逻辑。

但也不是说 zsh 中就彻底没有必要用 eval 了,在某些特别的场景(好比用于改造语法加语法糖)仍是有用的。但若是要使用,就必定要注意它可能致使的反作用,利弊只能本身权衡了。eval 的具体用法,和 bash 中的基本没有区别,能够去网上搜索 bash eval 用法来了解,这里就不介绍了。

总结

本文简单介绍了 alias 的用法和 eval 的场景使用场景。alias 很简单,主要在 .zshrc 里使用。eval 很复杂,非必要场景尽可能避免使用。

本文再也不更新,全系列文章在此更新维护:github.com/goreliu/zshguide

付费解决 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等领域相关问题,灵活订价,欢迎咨询,微信 ly50247。

相关文章
相关标签/搜索