Bash:别名中的空格


116

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

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

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

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


8
为什么不这样做alias lsm='ls -la | more'
Nifle

Answers:


125

击文档状态“对于几乎所有目的,壳功能优于别名”。这是一个Shell函数,如果参数由(only)组成,它将替换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

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

1
@sixtyfootersdude:双括号形式更强大,我习惯使用它。参见mywiki.wooledge.org/BashFAQ/031
丹尼斯·威廉姆森

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

1
@Jeef:不,我的答案使用的是函数而不是别名。我已对其进行编辑,以使其更加清晰。
丹尼斯·威廉姆森

6
@merlinpatt:command防止递归调用该函数。
丹尼斯·威廉姆森

53

别名手册页中

如果没有引号,则检查每个简单命令的第一个单词,以查看其是否具有别名。如果是这样,该词将被替换为别名文本。别名和替换文本可以包含任何有效的shell输入,包括shell元字符,但别名不能包含“ =”。

因此,仅检查第一个单词的别名是否匹配,这使得不可能使用多单词的别名。您可能可以编写一个shell脚本来检查参数,如果参数匹配则调用您的命令,否则仅调用普通命令ls(请参阅@Dennis Williamson的答案


8
+1用于解释为什么不允许使用ls -la作为别名。
stytyfootersdude”,2010年

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

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

14

丹尼斯的答案采用了稍微改进的方法:

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


2
如果我想ls -lat被排除在这种治疗方式之外,该如何处理?我需要在案件上方放一个案件处理-la*,是吗?
史蒂文·卢

-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.