我用Java编写了一个shell脚本(test.sh).此shell脚本实际上从一个文件到另一个文件执行复制作业.执行shell脚本后,我从Console打开了目录并键入了ls.它显示输出文件?延期后.
例如:foo.csv?
File execFile = new File(file);
FileWriter fwFile;
try {
fwFile = new FileWriter(execFile);
execFile.setExecutable(true);
BufferedWriter bwFile = new BufferedWriter(fwFile);
bwFile.write(strOutput.substring(0, 2));
bwFile.write("\r\n");
bwFile.write("cd " + strOutput);
bwFile.write("\r\n");
bwFile.write("mkdir " + strOutput);
bwFile.write("\r\n");
bwFile.write(strUnixPath);
bwFile.write("\r\n");
bwFile.write("cd " + strWorkingPath + IPlatinumConstants.FS+"lib"+IPlatinumConstants.FS+"Unx");
bwFile.write("\r\n");
bwFile.write("echo Cut Src Start time %time%");
bwFile.write("\r\n");
bwFile.write("cp " + " \"" + strSourceFilePath + "\" \""
+ strOutput + "copy_A\"");
bwFile.write("\r\n");
Run Code Online (Sandbox Code Playgroud)
gra*_*ity 13
我猜:
您的Java程序正在使用\r\n回车符+换行符来终止每一行.但是,Unix系统仅使用换行\n作为换行符.虽然终端可以理解回车,但它对其他程序毫无意义 - 就/bin/sh翻译而言,它只是一个与其他程序一样的字符 .这意味着它将\r成为脚本运行的每个命令的最后一个参数的一部分:
cd myoutput\r
mkdir myoutput\r
cd something/lib/something\r
echo Cut Src Start time %time%\r
cp "sourcefile" "myoutputcopy_A"\r
Run Code Online (Sandbox Code Playgroud)
因此,最后一个命令始终创建在其名称末尾具有回车符的文件,并将其 ls显示为与所有其他"不可打印"字符一样的问号.你可以使用ls -b或 看到这个 ls -Q.
要解决此问题,请仅\n在生成Unix shell脚本时使用.(或者,更好的是,不要生成shell脚本 - 而是编写在需要的地方接受参数的脚本.你也可以在Java程序本身做很多事情.)