【问题标题】:Bash script add variable to alias [duplicate]Bash脚本将变量添加到别名[重复]
【发布时间】:2022-01-20 18:28:31
【问题描述】:

我正在尝试运行此脚本 -

#!/bin/bash

my_opts="-2 -o StrictHostKeyChecking=no -o FallBackToRsh=no -q -i /root/.ssh/identity"
alias ssh='ssh $my_opts'

type ssh

它给我的输出是ssh is /usr/bin/ssh。需要更改什么以使输出为 - ssh -2 -o 'StrictHostKeyChecking no' -o 'FallBackToRsh no' -i /root/.ssh/identity

提前致谢。

【问题讨论】:

  • 使用' 时不会发生字符串插值。请改用"
  • 另外,别名不会在 bash 的非交互式 shell 中展开,除非你 shopt -s expand_aliases。请改用函数。
  • 谢谢杰夫。将alias ssh='ssh $sshopts' 修改为alias ssh="ssh $sshopts" 没有任何区别。输出是一样的。
  • 你想做什么?对于您显示的内容,解决方法是直接使用选项运行ssh。为什么是间接的?

标签: bash shell sh


【解决方案1】:

忘记别名,定义一个函数。

ssh () {
    command ssh -2 -o StrictHostKeyChecking=no -o FallBackToRsh=no -q -i /root/.ssh/identity "$@"
}

【讨论】:

    【解决方案2】:

    通过使用 ' 您正在创建一个文字字符串,在许多语言中也知道字符串作为文字 - bash 也不例外。或称为字符串 interpol。您需要使用 " 才能通过字符串传递 var,除非您像这样用 ' 围绕栏

    alias install='install '$var''

    参考 https://www.gnu.org/software/bash/manual/html_node/Single-Quotes.html

    还要确保您使用的是source,例如source ./script.sh 在您的脚本上,并且在键入命令时未使用 bash ./script.sh 运行

    【讨论】:

    • 这不是问题所在;使用单引号可防止变量在定义别名时扩展,而是在使用别名时扩展。此外,您的示例在定义命令中未引用 $var,这可能会导致麻烦(取决于使用的 shell,以及变量的值是什么)。
    • 这仅适用于定义别名时(即执行alias 命令时)。但是在处理该alias 命令期间引号会被删除,因此它们不包含在实际别名中,因此当别名使用时它们不存在。尝试运行(在交互式 shell 中)var=initialval,然后是 alias foo='echo $var',然后是 var=otherval,最后是 foo(请注意,您应该一次运行它们,而不是使用分号作为一行,因为扩展顺序在一行中变得很奇怪)。然后尝试使用alias foo='echo '\''$var'\' 并注意区别。
    • OP 的核心问题是别名没有在脚本中展开(即当shell 不交互时),默认情况下。引用与此处的核心问题无关。
    • @CharlesPorth,如果 OP 到达与此相关的地方,则其脚本中 type ssh 的输出将类似于 ssh is aliased to 'ssh $my_opts' (您的答案将集中在更改my_opts 添加选项的实际代码)。但是这个答案解决的问题不是OP的问题。
    • @CharlesPorth, ...另一件事是alias install='install '$var'' 非常愚蠢- 说alias install="install $var" 是一种不必要的罗嗦和略带错误的方式(错误因为$var 的内容是展开未引用,因此不受分词或全局扩展的保护)。写alias install='install '"$var" 会少一些不正确,但还是很傻。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2018-03-02
    • 2022-01-20
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多