Unix:“ls”命令显示文件?延期后

时间:2014-06-25 06:38:10

标签: bash unix shell file java

我使用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");

1 个答案:

答案 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 -bls -Q来查看此内容。

要解决此问题,请在生成Unix shell脚本时仅使用\n。 (或者,更好的是,生成shell脚本 - 而是编写在需要的地方接受参数的脚本。您也可以在Java程序本身中做很多事情。)