2

Несуществующий файл

$ ls file_not_exists.txt
ls: cannot access file_not_exists.txt: No such file or directory
$ echo <> file_not_exists.txt

$ ls file_not_exists.txt 
file_not_exists.txt
$ cat file_not_exists.txt
$

Файл с содержанием

$ cat temp.txt 
asdf
$ echo temp.txt 
temp.txt
$ echo <> temp.txt 

$ cat temp.txt 
asdf 

Если файл не существует, echo <> file_not_exists.txt создаст новый файл. Поэтому я думаю, что > работает (перенаправляя пустой вывод во вновь созданный файл). Но если в файле есть что-то (например, temp.txt), почему это не очищается echo <> temp.txt?

2 ответа2

3

Из расширенного руководства по написанию сценариев Bash

[j]<>filename
  #  Open file "filename" for reading and writing,
  #+ and assign file descriptor "j" to it.
  #  If "filename" does not exist, create it.
  #  If file descriptor "j" is not specified, default to fd 0, stdin.
  #
  #  An application of this is writing at a specified place in a file. 
  echo 1234567890 > File    # Write string to "File".
  exec 3<> File             # Open "File" and assign fd 3 to it.
  read -n 4 <&3             # Read only 4 characters.
  echo -n . >&3             # Write a decimal point there.
  exec 3>&-                 # Close fd 3.
  cat File                  # ==> 1234.67890
  #  Random access, by golly.

Так,

echo <> temp.txt

temp.txt если он не существует, и печатает пустую строку. Это все. Это эквивалентно:

touch temp.txt && echo

Обратите внимание, что большинство программ не ожидают, что дескриптор файла STDIN (0) будет открыт для записи, поэтому в большинстве случаев следующее будет примерно эквивалентным:

command <> file
command 0<> file
touch file && command < file

А поскольку большинство программ не ожидают, что STDOUT будет открыт для чтения, следующее обычно примерно эквивалентно:

command 1<> file
command > file

И для STDERR:

command 2<> file
command &2> file
1

echo <> temp.txt вызывает открытие файла temp.txt для чтения и записи по дескриптору файла 0 (stdin).

От man bash:

Открытие файловых дескрипторов для чтения и записи Оператор перенаправления

          [n]<>word

   causes the file whose name is the expansion of word to be
   opened for both reading and writing on file descriptor n,
   or on file descriptor 0 if n is not  specified.   If  the
   file does not exist, it is created.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .