所以我试图创建一个别名,列出当前目录中的文件,如"ls-lAh";会,但只针对我想要的特定列。所以我想出了这个命令:
ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print $6,$7,$8,$5,$9}'
这将只打印我需要的列,它们是日期和时间、文件大小和文件名。
然而,如果我想为这个命令创建一个别名,我显然需要转义很多字符,以便正确解释它们,但我没有做到这一点。有时,当我在单引号或美元符号前面放一个反斜杠时,它只是以某种方式断开,我无法使其工作。
请帮助我理解我应该如何逃离特殊字符,以便正确解释。
如果它改变了什么,我在MacOS上。如果需要,请要求澄清。
编辑:-以下是我在尝试实际创建别名时所做的尝试:
alias lah='ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print $6,$7,$8,$5,$9}''
我试着把反斜杠放在每个特殊字符之前,第一次尝试时我只是把它们放在单引号之前,这不起作用,它告诉我类似zsh: parse error at {
的东西。然后我在每个大括号之前放了一个反斜杠,但这不起作用,显然美元符号也是特殊字符,所以我在这些字符之前放了反斜杠,但是每当我在键入命令后按回车键时,它就会生成一行新的内容quote>
,我必须在其中放一个引号来结束命令,当我这样做时,它会打印出:zsh: command not found: {print
。
问题是如何正确地用单引号引用已经包含单引号的字符串。
ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print $6,$7,$8,$5,$9}'
为了容易地获得正确引用的字符串,您可以使用ZSH的密钥序列ESC'(单引号(。
- 键入要引用的字符串,例如
ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print $6,$7,$8,$5,$9}'
- 按ESC,然后按'CD_5的内容
- 继续执行命令的其余部分或复制&将引用的字符串粘贴到编辑器中
通常,要在单引号中引用单引号,您需要插入一个结束引号'
、一个转义引号'
,如有必要,还需要一个开头引号'
,如下所示:
alias lah='ls -lAh | awk '''BEGIN{FS=" "; OFS=" "} {print $6,$7,$8,$5,$9}''
另一个选项是对"外部"引号使用双引号,因为双引号字符串中支持转义。诀窍是知道什么需要逃脱:
alias lah="ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print $6,$7,$8,$5,$9}'"
请注意,如果您要求zsh
显示此别名,它会将其规范化为使用单引号,如@Bodo的回答:
% alias lah
lah='ls -lAh | awk '''BEGIN{FS=" "; OFS=" "} {print $6,$7,$8,$5,$9}''
您应该在.bashrc
中设置一个函数,而不是别名。例如:
ldir() {
ls -lAh | awk 'BEGIN{FS=" "; OFS=" "} {print $6,$7,$8,$5,$9}'}
然后重新加载bashrc:
source .bashrc
您现在应该能够运行ldir
命令了。