ファイル名が参照されても「-」というファイルにアクセスできないのはなぜですか? [コピー]

ファイル名が参照されても「-」というファイルにアクセスできないのはなぜですか? [コピー]

というファイルがあります-。その内容を表示したいです。

  • 1つの方法は次のとおりです。
    cat ./-
    
    cat -標準入力から読み取るからです。
  • しかし、、なぜcat "-"そしてcat '-'またシェルによって解釈されますかcat -

答え1

シェルはcat引用符を表示する前に引用符を削除します。 Socat -とその両方は、cat "-"スペーストークン化、ワイルドカード拡張、および引用符のシェルを削除した後に配列に渡さcat '-'れます。['cat', '-']

答え2

引用符はシェルで使用され、次のコマンドには渡されません。

例えば

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パスと名前

引用符は、スペース区切りと変数拡張(単一引用符の場合)から値を保護します。引用符は、引用符がファイルであることを示していません。値がファイルであることを明確にするには、相対パスまたは絶対パスを前に付けます。

その場合、GNUは現在の作業ディレクトリにファイルがあるかどうかをcat確認する必要があることを示唆しているかもしれませんが、-ファイル名がハイフンで始まったりハイフンであることは一般的ではないため、これはパフォーマンスの問題かもしれません。 David Wheelerの記事、UNIX および Linux ファイル名の変更、一つあります。良い議論この質問は歴史的文脈で扱われるべきです。

関連情報