Mar*_*lon 5 linux windows bash filenames
在linux shell脚本生成文本文件时,我遇到了一个相当奇怪的问题.情况是这样的:
在我的Synology Disk Station上,我正在执行一个sh脚本.它使用只读SQL用户访问本地mySQL数据库.有多个呼叫(每个呼叫一行),每个呼叫将接收的输出写入不同位置的.csv文件.
.sh脚本如下所示:
/some/path/create_lists.sh
mysql --arguments < /path/to/script1.sql > /path/to/outfile1.csv
mysql --arguments < /path/to/script2.sql > /path/to/outfile2.csv
mysql --arguments < /path/to/script3.sql > /path/to/outfile3.csv
mysql --arguments < /path/to/script4.sql > /path/to/outfile4.csv
Run Code Online (Sandbox Code Playgroud)
使用我的Windows PC我想访问这些文件.
原则上,这已经工作正常,但不知何故只有最后创建的.csv文件可以直接被MS Excel读取.在上面的示例中,outfile4.csv将是唯一可读的文件.在交换第3行和第4行时,outfile3.csv是可读的.对于outfile4.csv,将创建一个具有完全相同名称的新文件,MS Excel无法打开该文件.但Notepad ++能够打开它.
它在Windows资源管理器中看起来像这样:
\\myNAS\path\to
outfile4.csv (working)
outfile4.csv (not working)
Run Code Online (Sandbox Code Playgroud)
怎么会有两个同名的文件?一个正在工作而另一个没有?
在写这个问题的时候,我自己解决了这个问题,但是我仍然希望将其发布给其他人看.
这是解决方案:我使用Notepad ++在Windows PC上编写脚本.我将它们保存在NAS上的专用脚本文件夹中.由NAS运行它们似乎工作,但有一个小细节导致了这个问题.回车.
虽然Windows使用回车符(\ r) 和换行符(\n)导致\ r \n为新行,但基于unix的系统仅使用换行符(\n)
通过在Windows机器上编写脚本,我基本上写道:
mysql --arguments < /path/to/script1.sql > /path/to/outfile1.csv\r\n
mysql --arguments < /path/to/script2.sql > /path/to/outfile2.csv\r\n
mysql --arguments < /path/to/script3.sql > /path/to/outfile3.csv\r\n
mysql --arguments < /path/to/script4.sql > /path/to/outfile4.csv
Run Code Online (Sandbox Code Playgroud)
在linux上读取文件导致:
mysql --arguments < /path/to/script1.sql > /path/to/outfile1.csv?\n
mysql --arguments < /path/to/script2.sql > /path/to/outfile2.csv?\n
mysql --arguments < /path/to/script3.sql > /path/to/outfile3.csv?\n
mysql --arguments < /path/to/script4.sql > /path/to/outfile4.csv
Run Code Online (Sandbox Code Playgroud)
我通过SSH列出包含文件夹的内容找到了这个,它给了我:
ls -alh /path/to
... outfile4.csv
... outfile4.csv?
Run Code Online (Sandbox Code Playgroud)
我们终于得到它了!这就是为什么最后一个文件正在工作而其他文件不工作的原因.这也是为什么可以有两个具有"相同"名称的文件的原因.Windows根本不显示引起很多混淆的问号.
因此,如果有人遇到这个问题,他可能会偶然发现这个问题并节省他的一些时间.我想这对大多数人来说都是常识,但我仍然是Linux的初学者,所以我必须学习它很难:)