为什么即使引用文件名也无法访问名为“-”的文件?

为什么即使引用文件名也无法访问名为“-”的文件?

我有一个名为 的文件-。我想显示其内容。

  • 一种方法是做
    cat ./-
    
    因为cat -从标准输入读取。
  • 然而,为什么cat "-"cat '-'也被 shell 解释为cat -

答案1

shell 在cat看到任何引号之前会删除它们。 Socat -cat "-"and all在空格标记化、通配符扩展和 shell 删除引号之后cat '-'作为数组传递。['cat', '-']

答案2

引号由 shell 使用,而不传递给命令:

例如

cat "hello world" #this passes the single token `hello world`, to `cat`, as argument 1. However the quotes are not passed.
cat "-" # this passes the single token `-`, to `cat`, as argument 1. The same as if no quotes had been used.

答案3

GNUcat编码的在尝试将给定文件名作为文件打开之前将其与字符串“-”进行比较:

  if (STREQ (infile, "-"))
    {
      have_read_stdin = true;
      input_desc = STDIN_FILENO;
      if (file_open_mode & O_BINARY)
        xset_binary_mode (STDIN_FILENO, O_BINARY);
    }
  else
    {
      input_desc = open (infile, file_open_mode);
      if (input_desc < 0)
        {
          error (0, errno, "%s", quotef (infile));
          ok = false;
          continue;
        }
    }

因此,如果您有一个名为 的文件-,您需要通过cat给出路径和名称

引号可以保护值免遭空格分割以及变量扩展(如果是单引号)的影响。引号并不表示引用的内容是文件。要明确表示某个值是一个文件,请在其前面加上相对或绝对路径。

话虽如此,有人可能建议 GNUcat还应该检查是否-当前工作目录中是否有文件,但文件名以连字符开头或仅是连字符的情况并不常见,因此这可能是一个性能问题。大卫·惠勒的文章,修复 UNIX 和 Linux 文件名, 有一个很好的讨论这个问题要放在历史背景下。

相关内容