【问题标题】:Using wildcards and quotation marks in ssh在 ssh 中使用通配符和引号
【发布时间】:2013-11-30 20:28:03
【问题描述】:

我有一个文件,我想用 "Nov 30""Nov 30" 之类的字符串 grep 出行(基本上我不想指定中间的空格数。

在终端中这很好,我会这样做:

grep 'Nov * 30' file

但是,为了我的目的,最好保持一般性,所以实际上我想做这样的事情:

grep "$(date +%b) * $(date +%d)" file

这很好,但我实际上想通过 ssh 来做到这一点,所以它就像

ssh -t host "grep "$(date +%b) * $(date +%d)" file"

此时我遇到了问题。它不是仅针对 11 月 30 日类型的日期字符串进行 grepping,而是返回各种不同的 11 月日期。我觉得这个问题与双引号的使用有关(也许 -t 参数的第一组双引号影响了第二批,但我不知道如何解决这个问题),我从@看到987654321@ 回答“bash 将在本地计算机上评估和替换双引号内的变量,但会在单引号内的目标计算机上执行此操作”。所以我尝试用

替换上面的
ssh -t host "grep '$(date +%b) * $(date +%d)' file"

但现在 grep 根本不返回任何结果!我认为这是因为我正在寻找文字'$(date +%b)...'而不是替代的'Nov..',但是我不明白为什么第一次尝试使用双引号没有工作。

欢迎任何帮助

【问题讨论】:

标签: regex bash quotation-marks


【解决方案1】:

转义你的引号:

ssh -t host "grep \"$(date +%b) * $(date +%d)\" file"

【讨论】:

    【解决方案2】:

    或者,单引号您希望在远程计算机上执行的命令行。 (在这种情况下,date 命令将在远程端执行。)

    ssh -t host 'grep "$(date +%b) * $(date +%d)" file'
    

    【讨论】:

      【解决方案3】:

      在此版本中,date 命令将在本地执行:

      ssh -t host "grep '$(date +%b) * $(date +%d)' file"
      

      在此版本中,date 命令将在远程主机上执行:

      ssh -t host 'grep "$(date +%b) * $(date +%d)" file'
      

      当您的本地 PC 和服务器位于不同的时区时,这可能会有所不同。例如,现在在法国是 12 月 1 日,但在我的美国服务器上是 11 月 30 日。

      在第一个版本中,双引号内的$() 在发送到服务器之前被评估。所以发送到服务器的命令在我的时区是grep 'Dec * 1' file

      在第二个版本中,单引号内的$() 在发送到服务器之前不会被评估。所以发送到服务器的命令是grep "$(date +%b) * $(date +%d)" file,所以服务器会评估双引号内的$()

      【讨论】:

        猜你喜欢
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 1970-01-01
        相关资源
        最近更新 更多