【问题标题】:Unix: “ls” command shows files with ? after the extensionUnix:“ls”命令显示带有 ? 的文件扩展后
【发布时间】:2014-08-17 20:17:33
【问题描述】:

我使用 Java 编写了一个 shell 脚本 (test.sh)。这个 shell 脚本实际上是从一个文件复制到另一个文件。执行完 shell 脚本后,我从控制台打开目录并输入 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");

【问题讨论】:

  • ls 不应切勿用于向最终用户展示、仅供人类消费以外的任何目的。阅读 mywiki.wooledge.org/ParsingLs 以了解(只是其中一些)尝试以编程方式使用 ls 时可能出错的事情的描述。
  • 你的程序也有当前编写的 shell 注入安全漏洞 -- 如果一个目录的名称类似于 foo$(rm -rf $HOME)bar,猜猜当你对写入的缓冲区调用 shell 时会发生什么?

标签: bash unix shell file java


【解决方案1】:

我的猜测:

您的 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 程序本身中做很多事情。)

【讨论】:

  • 我实际上会假设脚本甚至没有cd OP 想要它去的地方。所以,一团糟。
  • 检查这个答案是否反映了实际问题OP可以运行ls | xxd并查看文件名十六进制表示后是否有0d
  • @Ruslan - 或使用ls -b
  • @AFH 哦,那更干净了
  • 值得注意的是\n可以合法地用作文件名中的字符,因此将其用作分隔文件名的字符注定要失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
相关资源
最近更新 更多