当前位置: 首页 > 知识库问答 >
问题:

bash而循环在远程运行与本地运行时的行为不同[重复]

呼延景同
2023-03-14

有一个简单的日志文件 /tmp/test.log

2019-12-09 15:28:12 UTC [6308] App1
2019-12-09 15:29:08 UTC [1246] App2
2019-12-09 15:30:57 UTC [5541] App3

有一个简单的bash脚本 /tmp/test.sh

#!/bin/bash
# 
while read line
do
    echo $line
done < /tmp/test.log

如果我在本地运行这个脚本,它会像预期的那样工作:

$ /tmp/test.sh
2019-12-09 15:28:12 UTC [6308] App1
2019-12-09 15:29:08 UTC [1246] App2
2019-12-09 15:30:57 UTC [5541] App3

但如果我通过ssh运行此脚本,我会得到一些意想不到的结果:

$ ssh 127.0.0.1 "/tmp/test.sh"
2019-12-09 15:28:12 UTC 0 3 App1
2019-12-09 15:29:08 UTC 1 App2
2019-12-09 15:30:57 UTC 1 App3

有人知道为什么吗?

共有1个答案

荆利
2023-03-14

我认为这里有两个相互作用的独立事物导致了混乱的结果。这是我最好的猜测解释。

重要IFS变量的值可能是20 09 0a(这些是十六进制代码,用于空格、制表符、换行符)。这对echo(以及read语句)有重要影响。(使用echo-n“$IFS”| hextump查看值)。

read命令将从文件中读取每一行,并将它们全部添加到line变量中。它实际上会标记每行,并将每个单词添加到line

echo语句将导致计算line中的值。shell将使用IFS将值分隔成单独的标记,然后将它们全部传递给echo,后者将打印它们,用空格分隔。即存在难以观察到的外壳预处理步骤。

问题出现在[6308]等令牌上。方括号用于shell全局绑定,因此当bash遇到类似[6308]的内容时,它会尝试将其与当前目录中名为6308的文件相匹配。因此,如果您有两个名为03的文件,它将匹配这两个文件并返回字符串03

在本地运行而不是通过ssh运行时,结果不同的原因很可能是由于调用脚本的当前工作目录。当通过ssh运行时,它不会从本地当前目录运行。要查找用于ssh调用的cwd,只需在文件顶部附近放置一个pwd。我猜通过ssh调用使用的目录中有名为0等的文件。

简单的修复方法是防止shell处理$line的内容,方法是用引号括起来,如echo"$line"。您也可以调整IFS,但是引用字符串是通常的做法。

 类似资料:
  • 我有一个mapreduce代码在我的本地计算机上运行良好。然后,当我在远程服务器上运行它时,我会得到以下执行选项 在我的IntelliJ集成开发环境中,我有一个外部库avro-mapred-1.7.7-hadoop2。jar,我从中构建了工件。当我解压缩工件的jar时,我正确地找到了,并且在组织中正确地找到了AvroKeyInputFormat。阿帕奇。阿夫罗。mapreduce软件包。那么我在这

  • 我创建了一个测试项目(maven)来测试REST API的性能。我正在使用Jeter插件 这是我的pom片段 我有一个Jenkins文件在我的项目像这样 当我触发Jenkins上的构建时,构建成功了,我在控制台输出中看到了这一点 问题是,它什么也做不了。Performace趋势图没有显示任何东西。 如果我在本地机器上运行相同的项目,它工作得非常好。我在日志中看到类似的东西,证实了这一点。生成的输出

  • 问题内容: 我正在使用python更新一些LED。我一直在这样做: 我想用Flask充当一些我可以在我的浏览器中运行的ReactJS前端(以更改当前模式等)与Python中的LED控制代码之间的桥梁。 我的Flask工作正常,可以处理HTTP请求,等等。我想知道如何设置我的flask应用程序同时连续运行(或快速运行),同时仍然能够相互通信,就像这样: 我遇到了,这似乎可以解决问题,但对于我的问题有

  • 以下是在远程主机上安装PIP/BOTO的任务,这些任务在运行route53模块时不会再出现错误:

  • 问题内容: 假设我在同一台计算机上同时运行两个Java程序。这些程序将在单个JVM实例中运行还是在两个不同的JVM实例中运行? 问题答案: 如果您使用命令(从命令行)开始每个命令,它们将作为完全独立的JVM运行。 “程序”可以作为在一个JVM中运行的单独线程启动。

  • 我将bash脚本存储为db中的字符串,我需要根据用户需求调用它。脚本应该从PHP级别在远程机器上执行。我找到了以下主题: 关于ssh连接和调用远程脚本的两个主题: 如何使用SSH在远程计算机上运行shell脚本 https://serverfault.com/questions/241588/how-to-automate-ssh-login-with-password 以及在php中使用它的两种