如何将命令行参数传递给shell别名?

Vin*_*ini 278 shell alias

如何将命令行参数传递给别名?这是一个示例:

alias mkcd='mkdir $1; cd $1;'

但在这种情况下,$ xx将在别名创建时转换,而不是在运行时转换.但是,我创建了一个使用shell函数的解决方法(在googling之后),如下所示:

function mkcd(){
  mkdir $1
  cd $1
}

只是想知道是否有办法制作接受CL参数的别名.
顺便说一句 - 我使用'bash'作为我的默认shell.

Tho*_*att 266

只是为了重申已发布的其他shell的内容,在Bash中有以下工作:

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'
Run Code Online (Sandbox Code Playgroud)

运行以下内容:

blah one two
Run Code Online (Sandbox Code Playgroud)

给出下面的输出:

First: one
Second: two
Run Code Online (Sandbox Code Playgroud)

  • 我没有看到它比`function blah(){echo"First:$ 1"更受欢迎; 回声"第二名:2美元"; }` (12认同)
  • @mynameispaulie双引号允许`Bash`用传递给函数的参数替换`$ 1`和`$ 2`.单引号告诉Bash不要这样做. (5认同)
  • 好的解决方案 来自bash新手的一些问题:函数是否必须以下划线命名(或者根本不同)或者仅仅是为了可读性?在定义函数时尾随"; _blah"的目的是什么?为什么当使用双引号代替单引号($ 1未正确解释)时,即使在$ 1附近做一些不需要引号的东西时它也不起作用?提前感谢您的建议.我有一个有效的解决方案,但总是想了解它的工作原理. (4认同)
  • 我看到这个别名/功能组合复制/粘贴很多,但它似乎没有任何有用的用途.标准方法是使用合理的名称定义函数一次,而不是别名. (3认同)
  • @mynameispaulie该函数可以命名为任何东西.我使用了下划线前缀,因为它是帮助防止名称冲突的常见技巧(即具有相同名称的另一个函数) (2认同)
  • @mynameispaulie关于尾随`; _blah`:分号是完成定义函数的语句.分号后面的`_blah`是别名运行时调用的实际函数.可能有助于理解当执行别名时,定义一个函数(或者如果以前运行则重新定义),然后实际调用它. (2认同)

Cha*_*tin 165

你找到了方法:创建一个函数而不是别名.C shell有一个为别名做参数的机制,但bash和Korn shell没有,因为函数机制更灵活,并提供相同的功能.

  • @ kaizer1v,我对CentOS7.3 bash版本4.2.46的观察是你的建议不能像你想象的那样工作.因为您使用的是双引号,所以$ 1实际上被计算为空字符串,而别名实际上与alias serve ="python -m SimpleHTTPServer"相同,因此在该别名之后传递的任何内容都是在命令行上传递的.如果你试试这套-x; alias serve ="python -m SimpleHTTPServer $ 1&"你会看到错误/问题.您的参数和alias命令都作为单独的命令运行. (6认同)

San*_*a R 54

你不能在ksh,但你可以在csh.

alias mkcd 'mkdir \!^; cd \!^1'
Run Code Online (Sandbox Code Playgroud)

在ksh中,功能是要走的路.但如果你真的想要使用别名:

alias mkcd='_(){ mkdir $1; cd $1; }; _'
Run Code Online (Sandbox Code Playgroud)


Chr*_*odd 16

引用bash手册页:

在替换文本中没有使用参数的机制.如果需要参数,则应使用shell函数(参见下面的函数).

所以看起来你已经回答了自己的问题 - 使用函数而不是别名


tde*_*ecs 12

您可能还会发现此命令很有用:

mkdir dirname && cd $_

其中dirname是您要创建的目录的名称

  • 你能解释它($ _)是如何工作的吗? (4认同)

小智 6

最简单的方法是使用函数而不是别名。您仍然可以随时从 cli 调用函数。在 bash 中,您可以添加 function name() { command } 它加载与别名相同的内容。

function mkcd() { mkdir $1; cd $1 ;}
Run Code Online (Sandbox Code Playgroud)

不确定其他贝壳


小智 5

我发现函数不能写在~/.cshrc文件中。这里是带参数的别名

例如,传递给“find”命令的参数

alias fl "find . -name '\!:1'"     
Ex: >fl abc
Run Code Online (Sandbox Code Playgroud)

其中 abc 是作为 !:1 传递的参数

  • 这对 OP 没有用,其默认 shell 是 bash。Sanjaya R 的回答在 4 年前提到了 csh 别名。 (4认同)