我正在尝试在bash中创建别名。我想做的是将ls -la映射到ls -la | more

在我的.bashrc文件中,这是我尝试过的操作:

alias 'ls -la'='ls -la | more'

但是它没有之所以起作用,是因为(我假设)别名中有空格。有没有解决的办法?

评论

为什么不别名lsm ='ls -la |更多'

#1 楼

Bash文档指出:“几乎所有目的,shell函数都比别名更受青睐。”这是一个替换ls的shell函数,如果参数由(仅)more组成,则导致输出通过管道传递到-la

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}


作为单线: br />
ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }


自动管道输出:

ls -la


评论


为什么需要在if语句中使用双括号?

–sixtyfootersdude
2010-2-8在14:55

@sixtyfootersdude:双括号形式更强大,我习惯使用它。参见mywiki.wooledge.org/BashFAQ/031

–丹尼斯·威廉姆森
2010-2-8在18:35

那么最后的命令是什么?别名ls ='ls()'??

–杰夫
2015年4月1日12:39

@Jeef:不,我的答案使用的是函数而不是别名。我已对其进行编辑,以使其更加清晰。

–丹尼斯·威廉姆森
2015年4月1日在14:14

@merlinpatt:命令可防止递归调用该函数。

–丹尼斯·威廉姆森
16年3月13日在18:05

#2 楼

在别名手册页中:


每个简单命令的第一个单词,
(如果未引用),将检查其是否具有别名。如果是这样,该词将被别名文本替换。别名
和替换文本
可以包含任何有效的shell输入,
包括外壳元字符,除了
别名
不包含`= '。


因此,仅对第一个单词进行别名匹配检查,这使得多单词别名变得不可能。您也许可以编写一个shell脚本来检查参数并在匹配时调用命令,否则只需调用普通的ls(请参阅@Dennis Williamson的答案)

评论


+1用于解释为什么不允许使用ls -la作为别名。

–sixtyfootersdude
2010-2-8 14:49

这很有用,因为它没有解决问题,而是回答了问题。我之所以来到这里,是因为我想创建一个在其中带有空格的别名,而这不会发生。

– angryundead
2014年2月11日在21:15

这不仅回答了我的问题,而且使我对混叠机制的实际工作方式有了宝贵的见解。您在手册页中的引用很有帮助。

–莉莉·芬利(Lily Finley)
19年1月21日在14:32

#3 楼

从Dennis的答案中得到的一种稍微改进的方法:

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

评论


如果我希望将l -lat排除在这种治疗之外,该如何处理?我需要在-la *条目上方放置一个案例来处理它,是吗?

–陆even
2014年4月28日下午5:36

谢谢。使用docker对我有用:function d(){case $ * in c *)shift 1;命令docker容器“ $ @” ;; n *)移位1;命令docker网络“ $ @” ;; *)命令docker“ $ @” ;; esac}。但是不幸的是,自动完成功能不起作用

–trogne
20-10-11在19:36



#4 楼

您仍然可以调用此别名,但是需要引号以使空格成为命令字的一部分。因此,"ls -la" -p pattern会将-p pattern选项传递给more,而不是ls