【问题标题】:Alias with variable in bash [duplicate]bash中带有变量的别名[重复]
【发布时间】:2011-05-25 04:49:18
【问题描述】:

我想在bash 中创建一个别名,如下所示:

alias tail_ls="ls -l $1 | tail"

因此,如果有人键入:

tail_ls /etc/ 

它只会显示目录中的最后 10 个文件。

但是$1 似乎对我不起作用。有什么办法可以在 bash 中引入变量。

【问题讨论】:

  • csh 和 tcsh 支持别名中的 $1 等参数; bash 没有。

标签: linux bash


【解决方案1】:

您可以使用set 定义$1,然后按预期使用您的别名:

$ alias tail_ls='ls -l "$1" | tail'
$ set mydir
$ tail_ls

【讨论】:

  • set在这里做什么?这是如何工作的?
  • @Brijesh, set mydir$1 定义为mydir,这将是预期的目录......不是那么好。
【解决方案2】:

tail_ls() { ls -l "$1" | tail; }

【讨论】:

  • 请修正语法错误(} 之前缺少;)和双引号$1,以便还支持带有嵌入空格和其他shell 元字符的文件名。
【解决方案3】:
alias tail_ls='_tail_ls() { ls -l "$1" | tail ;}; _tail_ls'

【讨论】:

  • 这是一种创造性的方法。如果他们需要使用别名而不是函数,那么绝对可以解决问题……我想如果可以选择使用函数,那么我会更喜欢函数,但是当正确的情况出现了!
【解决方案4】:

@maxim-sloyko 的解决方法不行,但是如果出现以下情况:

  1. 在~/.bashrc 中添加:

    sendpic () { scp "$@" mina@foo.bar.ca:/www/misc/Pictures/; }
    
  2. 保存文件并重新加载

    $ source ~/.bashrc
    
  3. 并执行:

    $ sendpic filename.jpg
    

原文来源:http://www.linuxhowtos.org/Tips%20and%20Tricks/command_aliases.htm

【讨论】:

  • @jruzafa,在这种情况下,您断言“maxim-sloyko 的解决方案不起作用”,而他/她的解决方案对我自己有效。
  • 你可以将你的函数添加到 bashrc 中:typeset -f >> ~/.bashrc
【解决方案5】:

如果您使用的是 Fish shell(来自 http://fishshell.com)而不是 bash,它们编写的函数会略有不同。

您需要向您的~/.config/fish/config.fish 添加类似的内容,这相当于您的~/.bashrc

function tail_ls
  ls -l $1 | tail
end

【讨论】:

    【解决方案6】:

    我会为此创建一个函数,而不是别名,然后将其导出,如下所示:

    function tail_ls { ls -l "$1" | tail; }
    
    export -f tail_ls
    

    注意-f 切换到export:它告诉它您正在导出一个函数。把它放在你的.bashrc 中,你就可以开始了。

    【讨论】:

    • 通常不需要导出函数。
    • @Dennis,是的,你是对的,对于一个不需要的简单别名,但它存在以防你想在某些派生的 shell/进程中使用它。
    • 在 bash 中你需要放一个分号 ';'将函数折叠成单行时,在关闭父“}”之前。 function tail_ls { ls -l "$1" | tail } 没有像 tail; } 这样的结尾是行不通的。
    • 如果可以直接调用函数,为什么还需要别名?
    • 这不是一个基于别名的解决方案,它是一个基于函数的解决方案..它工作顺利
    猜你喜欢
    • 2019-01-28
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2019-08-20
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多