如何在 bash 别名中使用空格?

如何在 bash 别名中使用空格?

我正在尝试在 bash 中创建别名。我想要做的是映射ls -lals -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

相关内容