【问题标题】:How to use a bash alias as a command line parameter如何使用 bash 别名作为命令行参数
【发布时间】:2016-07-14 14:52:16
【问题描述】:

我在谷歌上查到了这个,但以前似乎没有人问过这个问题。有没有办法可以设置别名并将其用作程序的命令行参数?

例如

ssh myserver

myserver被定义为我的服务器的ip地址

【问题讨论】:

  • shell 使用环境变量来解决此类问题,即myServer=192.168.0.1。然后被引用为ssh "$myServer"。一般来说,不要在别名定义上浪费时间,而是学习编写提供可重用服务的functions。祝你好运。
  • @shellter:很好的建议,但您可能指的是 shell 变量而不是 environment 变量。
  • @mklement0 :是的,你是对的语义。感谢您的澄清!祝大家好运。

标签: linux bash shell ssh alias


【解决方案1】:

其实是有办法的。但是您需要定义两个别名。

首先:Bash 手册状态 (LESS=+/'^ALIASES' man bash)

别名 如果别名值的最后一个字符为空白,则别名后的下一个命令字也会检查别名扩展。

还有documented in POSIX 规范。 Thanks to @gniourf_gniourf获取链接:

如果替换单词的别名的值以 结尾,shell 将检查下一个命令词的别名替换;这个过程将一直持续到找到一个不是有效别名的单词或别名值不以 结尾。


所以,如果你定义了这两个别名(请保留最后的空格):

$ alias ssh='ssh '
$ alias myserver='192.168.0.1'
$ set -x
$ ssh myserver
+ ssh 192.168.0.1

清除别名:

$ unalias ssh
$ unalias myserver

注意1:也记录在kshzsh 手册中

注意2:在dash 中测试为正常工作(未找到文档)。

Wikipedia entry on "alias" chaining

【讨论】:

  • This behavior is specified by POSIX: 如果替换单词的别名的值以 结尾,shell 将检查下一个命令词是否进行别名替换;这个过程将一直持续到找到一个不是有效别名的单词或别名值不以 结尾。
  • @gniourf_gniourf 感谢您的评论和链接。
【解决方案2】:

larsks' helpful answer 包含一个简洁的解释和一个特定于ssh 使用的有用解决方案;用更通用的解释来补充它:

除了BinaryZebra's helpful answer 中描述的别名链接外,别名通常只能用作命令名称,不能用作命令参数 ,至少不是直接的。

使用非文字(值占位符)作为命令参数,您有以下选项(撇开其他shell expansions,例如通配符、大括号扩展或算术扩展):

  • 引用一个变量;例如:ssh "$myserver",之前定义为,例如,myserver=1.2.3.4,例如在~/.bashrc

  • 使用command substitution;即,其标准输出将用作参数值的命令;例如:ssh "$(echo '1.2.3.4')"

但是,您也可以使用外壳函数为带有预定义参数的命令提供包装器;例如:

# Define the function, typically in ~/.bashrc
# "$@" safely passes all arguments through to `ssh`.
# (If the arguments must partly go *before* the predefined argument, more work is needed.)
sshmyserver() {
  ssh 1.2.3.4 "$@"
}

# Use the function, optionally with arguments.
sshmyserver 

【讨论】:

    【解决方案3】:

    一般来说,不,您的 shell 不会为您替换命令行参数。

    在您的具体示例中,您实际上有多种选择。您可以编辑您的 ~/.ssh/config 文件并添加如下条目:

    Host myserver
      HostName 1.2.3.4
    

    现在当您运行ssh myserver 时,ssh 将实际连接到主机1.2.3.4

    您还可以维护一个 ~/.hosts 文件,如下所示:

    myserver 1.2.3.4
    

    现在任何使用系统解析器的东西——包括ssh——都会将myserver翻译成1.2.3.4

    【讨论】:

      猜你喜欢
      • 2022-07-26
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 2018-04-29
      • 2010-10-11
      • 2015-01-04
      • 2014-07-14
      • 1970-01-01
      相关资源
      最近更新 更多