如何将整个命令存储在bash变量中,并通过有限的分词来执行它们



我有很多行,如下所示,其中前缀始终相同,实际执行的命令不同。

ssh -F "${SSH_CFG}" "${SSH_DST}" "[...]"
ssh -F "${SSH_CFG}" "${SSH_DST}" "[...]"
ssh -F "${SSH_CFG}" "${SSH_DST}" "[...]"

为了不需要重复我自己,我想让整个前缀也是一个变量,就像下面的例子一样:

SSH_CMD="ssh -F ""${SSH_CFG}"" ""${SSH_DST}"""
${SSH_CMD} "[...]"
${SSH_CMD} "[...]"
${SSH_CMD} "[...]"

只要空格不作为路径或选项的一部分,这就有效,因为根据我的理解,上面使用的前缀会被shell分词。当然,出于各种原因,我有一些带有空格的选项,这些选项需要按原样转发,作为一个论点。以上示例中的情况并非如此,并且整个命令失败。OTOH,引用前缀也是错误的,因为在这种情况下,一个带有参数的命令将被视为一个文件,并且找不到。因此以下示例不起作用:

SSH_CMD="ssh -F ""${SSH_CFG}"" ""${SSH_DST}"""
"${SSH_CMD}" "[...]"
"${SSH_CMD}" "[...]"
"${SSH_CMD}" "[...]"

我想要的是一个像上面的SSH_CMD这样的变量,其中包含一个预先引用的字符串,以处理空格等,并且该字符串被原样用作前缀。尽管如此,在这种情况下,我仍然需要通过shell使用空格来区分命令和所有单独的参数进行某种程度的分词,但在这些参数中,决不能进行分词,以保持带有空格的路径和选项的正确性。我找不到实现后者的方法:无论我尝试什么,要么都无法通过分词,要么像"'这样的字符被添加到路径和选项中,很可能也是错误分词的结果。

SSH_CMD="ssh -F ""${SSH_CFG}"" ""${SSH_DST}"""
${SSH_CMD} "[...]"
${SSH_CMD} "[...]"
${SSH_CMD} "[...]"

SSH_CMD="ssh -F ""${SSH_CFG}"" ""${SSH_DST}"""
ssh -F "${SSH_CFG}" "${SSH_DST}" "[...]"
ssh -F "${SSH_CFG}" "${SSH_DST}" "[...]"
ssh -F "${SSH_CFG}" "${SSH_DST}" "[...]"

那么,有什么方法可以让上面的例子发挥作用吗

谢谢!

定义一个函数,而不是变量。

ssh_cmd () {
ssh -F "$SSH_CFG" "$SSH_DST" "$@"
}

ssh_cmd "[...]"
ssh_cmd "[...]"
ssh_cmd "[...]"

除了您通常使用的引用之外,函数体不需要额外的引用,"$@"确保您对ssh_cmd的参数在对ssh的调用中保留为不同的参数。

相关内容

  • 没有找到相关文章

最新更新