当前位置: 首页 > Linux

Zsh开发指南(第16部分别名和eval的用法)

时间:2023-04-06 20:08:30 Linux

简介别名(alias)在shell中非常常用,主要用来给命令起别名,简化输入。但主要用于交互场景,在脚本中基本用不到。eval是一个非常强大的命令。它的作用是将一个字符串解析成代码然后执行,但是也会增加很多额外的复杂度,在不必要的场景下尽量少用。alias和eval看似没有任何关系,但功能相似,所以放在一起。alias最典型的例子就是将ls-l简化为ll:%aliasll='ls-l'%lltotal0drwx------0goreliugoreliu512Aug3113:55tmux-1000drwxr-xr-x0goreliugoreliu512Aug3113:37yaourt-tmp-goreliualias的效果相当于直接替换字符串,比较容易理解。#直接运行alias,会列出所有别名%aliasll='ls-l'lla='ls-F--color--time-style=long-iso-lA'...这样的别名只在该行如果存在,它将被解析。但是zsh中还有一个更强大的全局别名,即使不在行首也能解析:%alias-gG='|grep'%lsGtmuxtmux-1000但这需要额外注意可能的副作用,比如我认为创建一个名为G:%touchGtouch:missingfileopera的文件并尝试'touch--help'以获取更多信息。用法:grep[选项]...模式[文件]...尝试“grep--help”以获取更多信息。结果G被替换了,只能在G两边加上引号。如果全局别名使用不好,可能会导致灾难性的后果,比如误删重要文件(比如,后给rm传递一个全局别名,别名字符串中的一些文件只是被删除了),所以在使用之前需要进行权衡,使用时要小心。evaleval的功能是将字符串作为代码执行。看似很简单,其实涉及的内容很复杂,主要是符号转义带来的语义问题。在bash中,eval的一个重要使用场景就是将变量的值作为变量名,然后取其变量值,类似于C语言中指向变量的指针:%str1=str2%str2=abc%evalecho\$$str1abc注意这里有一个和两个$,原因是第二个$和平时一样,正常取str1的值,而第一个$需要转义,因为它需要eval执行时取str2的值,现在不能扩展。这种用法容易出错,可读性不强。幸运的是,在zsh中不需要使用这个,还有更好的方法:%str1=str2%str2=abc%echo${(P)str1}abc(P)专门用于这种场景,并且没有必要转义$.此外,eval有时用于动态执行代码。比如一个脚本接受用户的输入,这个输入也是一段脚本代码,所以可以用eval来运行。但这种用法极其危险,因为脚本中可能存在各种危险操作,而shell的语法非常灵活,很难通过静态扫描判断是否存在危险操作。不可靠的代码根本不应该运行。即使一定要运行,也可以在运行前写入文件,避免传入的代码影响自身逻辑。但这并不意味着zsh中不需要使用eval,在一些特殊场景下(比如修改语法,添加语法糖)还是有用的。但是如果要用的话,一定要注意它可能造成的副作用,只能自己权衡利弊。eval的具体用法与bash中基本相同。basheval的用法大家可以上网搜索了解一下,这里就不介绍了。小结本文简单介绍了alias的使用和eval的使用场景。alias很简单,主要用在.zshrc中。eval非常复杂,尽量避免在非必要场景下使用。本文不再更新,全系列文章更新维护在这里:github.com/goreliu/zshguideWindows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua等相关问题的付费解决方案,定价灵活,欢迎咨询,微信ly50247。