В UNIX, что "cat file1> file1 делает?" - PullRequest
16 голосов
/ 08 октября 2010

Когда вывод команды перенаправляется в файл, выходной файл создается или усекается оболочкой до выполнения команды, есть идеи, что делает cat foo> foo?

Ответы [ 4 ]

17 голосов
/ 08 октября 2010

Во всех случаях файл усекается.Это потому, что перенаправление обрабатывается оболочкой, которая открывает файл для записи перед вызовом команды.

cat foo > foo

Оболочка обрезает и открывает foo для записи, устанавливает stdout в файл, а затем exec ["cat", "foo"].

GNU cat умен и отказывается перенаправлять файл на себя.Это делается путем проверки пары устройство / индекс на дескрипторах входного и выходного файлов;Вы можете прочитать замечательные подробности низкого уровня в src / cat.c .Он печатает сообщение и завершает работу.

У BSD cat такой безопасности нет, но, поскольку файл уже обрезан, читать нечего, ничего не писать, и он останавливается.


Вы можете немного оживить, добавив вместо усечения.

echo hello > foo
cat foo >> foo

Теперь все то же самое, за исключением того, что оболочка открывает файл для добавления вместо усечения.

GNU cat видит, что вы делаете, и останавливается;файл не тронут.

BSD cat зацикливается и добавляет файл к себе, пока ваш диск не заполнится.

4 голосов
/ 08 октября 2010

На Fedora 13 это то, что я вижу

cat foo > foo
cat: foo: input file is output file

Если foo содержал что-то ранее, оно пропало.

2 голосов
/ 08 октября 2010

Файл сначала усекается, а затем читается, поэтому эта команда будет обрезать файл.

Когда я попытался выполнить это, я получил это предупреждение:

cat: test.txt: входной файл является выходным файлом

1 голос
/ 08 октября 2010

Оболочка будет усекаться, cat явно проверяет именованный параметр, но не проверяет stdin, как показано ниже, и всегда успешно:

$ uname -a
Linux bar 2.6.18-164.15.1.el5PAE #1 SMP Wed Mar 17 12:14:29 EDT 2010 i686 i686 i386 GNU/Linux
$ dd if=/dev/urandom of=foo bs=1024 count=4
4+0 records in
4+0 records out
4096 bytes (4.1 kB) copied, 0.00334456 seconds, 1.2 MB/s
$ od -c foo |head -2
0000000   U 371 003   z 224 334   z   K 236 221   k       <   c 256   !
0000020   %   % 256   V   \ 005   , 254   X 202 330 004 222   " 037 226
$ cat <foo >foo && od -c foo
0000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...