我最近添加了
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
我希望你能添加一些到我的bash_aliases文件中。在尝试时,我注意到虽然可以使用别名来代替..
,但却不能代替.
。那么在bash别名中允许使用哪些其他标点符号?
、制表符\t
、换行符\n
、/
、\
、$
、`
、=
、|
、&
、;
、(
、)
、<
、>
、'
和"
。根据Bash参考手册says:
别名名称中不能出现字符
/
、$
、`
、=
和任何上面列出的shell元字符或引用字符。
“Shell元字符”定义为:
一个未被引用时分隔单词的字符。元字符是一个空格,制表符,换行符或以下字符之一:|,&,;,(,),<或>。 "引用字符" 没有明确列出,但它们是反斜杠(\)和单引号(')和双引号(")。Bash检查别名名称在legal_alias_name()
中,该函数在这里实现:1, 2, 3。查看我系统上mksyntax.c(一个生成另一个C程序的C程序)的输出,shellbreak()
将对这10个字符返回true:\t\n &();<>|
,shellxquote()
对这4个字符返回true:"'\`
,而shellexp()
对$
返回true,最后legal_alias_name()
还检查了/
。
alias
表达式进行标记化以定义别名,以及2)它如何对以您的别名开头的命令进行标记化。对于第一个限制,=
不能出现在别名名称中,可能是因为alias foo=bar=baz
将被解析为foo
=bar=baz
,而不是foo=bar
=baz
。对于第二个限制,在我的实验中,您可以使用!
(history expansion字符)定义别名,但如果尝试使用它,除非!
位于命令末尾,否则会出现command not found
错误。最安全的做法是只使用数字、字母和下划线。!
(例如强制推送 gpf!
或交互式变基 gri!
),但只作为最后一个字符。不确定它们是否适用于别的别名位置。来到这个帖子是想看看我还能怎么使用 !
:) - Xunnamiusalias "abc!"=echo
可以运行,但 alias "a!bc"=echo
、alias "a\!bc"=echo
和 alias "!abc"=echo
无法运行。 - user3064538使用函数一直是更安全的选择:
function .. { cd '..'; }
function ... { cd '../..'; }
function .... { cd '../../..'; }
..() { cd '..'; }
...() { cd '../..'; }
....() { cd '../../..'; }
function grep { command grep --color=auto“$ @”; }
apt-get
)的一个事实标准是应该将-
(破折号)添加到列表中。此外,_~@#%^.,
都可以使用,而><'\"|=()`/?[]+!
则不能使用。另外还要担心$PATH
和像:
这样的特殊字符。如果正确转义或引用,空格和换行符似乎也可以工作,如"a b"
。/
符号,但是它没有起作用。 - Andrewhttps://www.gnu.org/software/bash/manual/html_node/Aliases.html 我不会在Linux中给别名取..这样的名字,因为..是当前目录的特殊名称,而..是父级目录的名称。可能有一些晦涩的进程会由于将..别名用于cd而被破坏。
..
定义为别名或函数,所描述的问题是一样的,但如果..
作为一个参数被使用,那么它们都不会被调用。由于.bashrc
仅在交互式shell下被调用,所以不必担心会改变任何shell脚本的行为,尤其是系统脚本(只要你不搞乱/etc/bashrc
,因为这些脚本将以root
身份而非用户身份运行)。 - chepner
bash
?我可以成功地为.
设置别名。然而,在POSIX规范中,.
已经被定义为一个命令名,所以你可能不应该用别名来覆盖它。 - chepner