linux - shell 错误地读取在 Windows 中创建的文件

标签 linux shell character-encoding

这是我的 shell 脚本和属性文件

测试.sh

#!/bin/bash
source ./default.properties
echo $app_name
echo "$app_name =="

默认属性

app_name=TestApplication

开始时,我在我的 Windows 上的 intellij 中创建了 test.shdefault.properties 文件。然后我复制到 Linux 并执行 test.sh。但是,我得到了结果:

TestApplication
 ==tApplication

然后我使用 vim 创建具有相同内容的新 default.properties。我得到了正确的结果

TestApplication
TestApplication ==

使用 diff 命令,它们确实不同,但我没有发现不同之处

diff default.properties default.properties_2
1c1
< app_name=TestApplication
---
> app_name=TestApplication

我在 Windows 上创建的文件中是否有一些不可见的字符,或者一些编码问题?

最佳答案

是的,您在分配 appName 变量的行末尾有一个 DOS 回车符。在大多数终端中,此控制字符会使光标移回行首。

不错的收获;这里的大多数提问者甚至都没有意识到这是一个问题。 bash tag wiki有一节是关于解决这个问题的。

Unix 上的许多工具会将有问题的字符显示为^M(control-M)或其八进制代码\015;十六进制是字符代码 0x0D,十进制是 13。

将来,如果您绝对必须使用 Windows 编辑器,使用 Unix 行尾保存,使用 ftp ASCII 模式传输文件(现在不是流行或安全的选项),或者运行dos2unix 传输后在 Unix 上的文件。

关于linux - shell 错误地读取在 Windows 中创建的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33772046/

相关文章:

bash - 如何递归退出嵌套的shell?

linux - wget 多个具有数字模式的文件

windows - 如何从命令行使用 svn+ssh 和 Tortoise SVN

Bash 脚本删除文本文件中的所有行,直到出现字符串

javascript - 将 html 输入转换为正确的编码

php - 考虑功能的字符集从 PHP5.2 更改为 PHP5.4

linux - 终端 vs. 中的命令bash.sh

c - 32 位编译在 64 位 Ubuntu 16.04 上失败

linux - 如何在不输入 'screen' 的情况下退出 'exit' ?

go - 用 Go 解码文本时忽略非法字节?