我有一个名为 的文件-
。我想显示其内容。
- 一种方法是做
因为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 文件名, 有一个很好的讨论这个问题要放在历史背景下。