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

5 java unix bash shell file

我用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程序本身做很多事情.)

  • @Ruslan - 或者使用`ls -b` (2认同)