我使用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");
答案 0 :(得分: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
因此,最后一个命令总是创建在其名称末尾带有回车符的文件,ls
将其显示为与所有其他“不可打印”字符一样的问号。您可以使用ls -b
或ls -Q
来查看此内容。
要解决此问题,请在生成Unix shell脚本时仅使用\n
。 (或者,更好的是,不生成shell脚本 - 而是编写在需要的地方接受参数的脚本。您也可以在Java程序本身中做很多事情。)