资讯专栏INFORMATION COLUMN

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

Neilyo / 2729人阅读

摘要:但如果要使用,就一定要注意它可能导致的副作用,利弊只能自己权衡了。的具体用法,和中的基本没有区别,可以去网上搜索用法来了解,这里就不介绍了。总结本文简单介绍了的用法和的场景使用场景。很复杂,非必要场景尽量避免使用。

导读

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

alias

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

% 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 的效果相当于直接将字符串替换过来,比较好理解。

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

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

% 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 两边加引号。

如果全局 alias 没用好,可能导致灾难性的后果,比如误删重要文件(像把某个全局 alias 传给 rm 后,恰好删除了 alias 字符串中的某些文件),所以需要执行权衡后再使用,并且用的时候要多加注意。

eval

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

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

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

注意这里有一个 和两个 $,原因是第二个 $ 是和平时一样,正常取 str1 的值的,而第一个 $ 需要转义,因为它要在 eval 执行的过程中取 str2 的值,不能现在就展开。

这个用法很容易出问题,而且可读性很差。幸好 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。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/10309.html

相关文章

  • Zsh 开发指南第十九篇 脚本实例讲解)

    摘要:导读本文将讲解一些比较简单的脚本实例。使用哈希表判断是否重复,删除哈希表里已经有的后续文件。思路建一个哈希表存放汉字与数字的对应关系。如果当前运行进程数达到最大进程并发数,则循环检查哈希表里的进程是否退出。 导读 本文将讲解一些比较简单的 zsh 脚本实例。 实例一:复制一个目录的目录结构 功能: 将一个目录及它下边的所有目录复制到另一个目录中(即创建同名目录),但不复制目录下的其他类...

    khlbat 评论0 收藏0
  • linux

    摘要:包括转义字符引号的使用等等。使用隐写术的指纹文件隐写术是将消息隐藏到不被认为会出现的地方的做法。在很好地执行了隐写术的片段中,任何不是预期接收者的人都能看到消息,但是却完全无法意识到消息就在那儿。 CentOS 7 时区、日期时间查看以及设置杂烩 CentOS 7 中时区、日期时间的查看、设置。包括网络时间协议 NTP 的安装和同步,Timedatectl 命令查看当前的时区、日期日期...

    lijinke666 评论0 收藏0
  • Zsh 开发指南第十篇 文件查找批量处理)

    摘要:当前目录下的两天内修改过的目录加上小于的普通文件从小到大排再加上所有的符号链接文件包括隐藏文件文件批量重命名对文件进行批量重命名,是一个比较常见的场景。参考更新历史增加不展开通配符和文件批量重命名。 导读 寻找满足特定条件的文件路径,简称文件查找,是 shell 脚本的常见任务,因为条件复杂多样,这样的任务并不轻松。很多人使用 find 命令来做,但 find 只能覆盖一部分功能,其他...

    lansheng228 评论0 收藏0
  • SpringBoot非官方教程 | 第十六篇:用restTemplate消费服务

    摘要:我将用去消费一个服务构架工程创建一个工程,去消费的服务。这个服务是,它会随机返回字符串。在项目中,它提供了一个非常简便的类,叫,它可以很简便的消费服务。消费服务通过消费服务,需要先中注册一个。 这篇文章主要介绍怎么用消费一个 Restful的web服务。我将用restTemplate去消费一个服务: http://gturnquist-quoters.cfa... 构架工程 创建一个s...

    CarterLi 评论0 收藏0
  • SpringBoot非官方教程 | 第十六篇:用restTemplate消费服务

    摘要:我将用去消费一个服务构架工程创建一个工程,去消费的服务。这个服务是,它会随机返回字符串。在项目中,它提供了一个非常简便的类,叫,它可以很简便的消费服务。消费服务通过消费服务,需要先中注册一个。 这篇文章主要介绍怎么用消费一个 Restful的web服务。我将用restTemplate去消费一个服务: http://gturnquist-quoters.cfa... 构架工程 创建一个s...

    flyer_dev 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<