ls -la
映射到ls -la | more
在我的.bashrc文件中,这是我尝试过的操作:
alias 'ls -la'='ls -la | more'
但是它没有之所以起作用,是因为(我假设)别名中有空格。有没有解决的办法?
#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
。
评论
为什么不别名lsm ='ls -la |更多'