【问题标题】:Pass wildcard to alias将通配符传递给别名
【发布时间】:2011-08-07 16:05:28
【问题描述】:

我使用修改列表命令作为别名(在 KSH 中):

alias ltf='ls -lrt -d -1 $PWD/*'

所以命令ltf 显示如下内容:

-rw-r--r-- 1 myuser mygroup 0 Apr 18 12:00 /usr/test.txt
-rw-r--r-- 1 myuser mygroup 0 Apr 18 12:00 /usr/test.log

现在我想使用通配符。但是使用ltf *.log 不起作用。

实现这一目标的最佳方法是什么?


更新:我想指定我的问题,因为到目前为止答案并没有解决我的问题:命令ls -lrt -d -1 $PWD/* 执行带有一些选项的列表命令,并显示完整路径,这对我来说很重要。

不幸的是,alias 方法不允许使用通配符参数。我的目标是让这成为可能。可能这是将命令创建为函数的最佳方式。答案中提到了这一点,但它还不起作用(参见 cmets)。

有什么想法吗?

【问题讨论】:

    标签: shell unix ksh


    【解决方案1】:

    正如其他人所提到的,通配符扩展是在调用 shell 函数之前完成的,但对于别名则不然。

    如果您不需要更改输入(OP 所做的),这将正常工作:

    alias ltf='ls -lrt -d -1'
    

    要实现 OP 想要的,在 shell 函数中,您需要使用 $@ 运算符来访问通配符扩展产生的文件集,然后您需要预先添加:

    ltf() 
    { 
        #Prepend $PWD to the start of every input
        set -- "${@/#/$PWD/}"   
    
        #Run the command on the prepended input
        ls -lrt -d -1 $@;
    }
    

    【讨论】:

      【解决方案2】:

      您的问题是通配符在当前目录中被 shell 扩展,而不是在 $PWD 中。您可以通过使用 shell 函数而不是别名并进行一些引用来解决此问题(为方便起见,我在示例中使用 $HOME) - 将其放在 .bashrc 中:

      ltf() {
          ls $HOME/$*
      }
      

      然后:

      $ ltf '*.log'
      

      【讨论】:

        【解决方案3】:

        试试

        alias ltf='ls -lrt -d -1 $1'
        

        或者如果你想要很多参数

        alias ltf='ls -lrt -d -1 $@'
        

        【讨论】:

        • 这不起作用,$1 等不能被别名识别。无论如何你可能得到结果的原因是$1 将是一个空字符串,所以ltf path 将是ls -lrt -d -1 path。所以你应该使用alias ltf='ls -lrt -d -1'来达到同样的效果,如果这不起作用,你将需要使用一个函数。
        【解决方案4】:

        使用 shell 函数而不是别名:

        function ltf {
          if [ -z "$1" ]; then
            ls -lrtd1 ${PWD}/*
          else
            ls -lrtd1 $1
          fi
        }
        

        【讨论】:

        • 出于兴趣,在 ksh 中是否有类似 bash 的类似符号:[[ -z "$1" ]] && ls -lrtd1 "$PWD/*" || ls -lrtd1 "$1"
        • 我认为应该是 else 语句之后的ls -lrtd1 ${PWD}/$1。谢谢!
        • @TechnoCore:没有。如果"$1" 是空字符串,则[ -z "$1" ] 为真,即没有参数。
        • 如果有参数,也应该执行PWD命令; ls -lrtd1 $1 不显示完整路径
        • 经过一些测试,我认为这种方法并不能解决问题。如果通配符(例如 *.log)返回多个文件,ltf *.log 仅列出一个文件。
        猜你喜欢
        • 1970-01-01
        • 2022-11-20
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2013-10-10
        • 2013-01-02
        • 2020-03-28
        • 2011-10-18
        相关资源
        最近更新 更多