我正在尝试在 bash 中创建别名。我想要做的是映射ls -la
到ls -la | more
在我的 .bashrc 文件中,我尝试执行以下操作:
alias 'ls -la'='ls -la | more'
但是它不起作用,因为(我猜)别名中有空格。有办法解决这个问题吗?
答案1
这Bash 文档指出“对于几乎所有用途,shell 函数都比别名更受欢迎。”这是一个 shell 函数,如果参数仅包含 ,它将替换ls
并导致输出通过管道传输到。more
-la
ls() {
if [[ $@ == "-la" ]]; then
command ls -la | more
else
command ls "$@"
fi
}
作为一行代码:
ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }
自动管道输出:
ls -la
答案2
来自别名手册页:
检查每个简单命令的第一个单词(如果未加引号)是否有别名。如果有,则用别名的文本替换该单词。别名名称和替换文本可以包含任何有效的 shell 输入,包括 shell 元字符,但别名名称不能包含“=”。
因此,只检查第一个单词是否匹配别名,这使得多单词别名无法实现。您可以编写一个 shell 脚本来检查参数,如果匹配则调用您的命令,否则只调用正常命令ls
(参见@Dennis Williamson 的回答)
答案3
丹尼斯的回答中采用了一种稍微改进的方法:
function ls() {
case $* in
-la* ) shift 1; command ls -la "$@" | more ;;
* ) command ls "$@" ;;
esac
}
或者单行:
function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }
如果需要,可以在命令后附加更多选项/参数,例如ls -la -h
答案4
您仍然可以调用此别名,但您需要引号,以便空格成为命令字的一部分。因此"ls -la" -p pattern
将-p pattern
选项传递给more
,而不是ls
。