2016-12-09 9 views
1

В Unix я знаю, что 0 1 и 2 представляют stdin stdout и stderr.
Почему cat 0> файл не работает

Как я понимаю, команда cat, что означает «concatenate», может конкатенировать разные файлы.

Например, cat file>&1 может сцепить file и стандартный вывод и стрелка означает, что перенаправление из file на стандартный вывод, таким образом, мы можем видеть содержимое file от терминала, который является стандартным выводом.

Но я не понимаю, почему ниже команда не работает:
cat 0>file

Я думаю, эта команда должна работать, потому что это означает, что конкатенировать стандартный ввод и file и сделать перенаправление от stdin до file.
Однако это не работает, и я получаю сообщение об ошибке:

cat: input error on standard input: Bad file number

Я думал, что cat > file и cat 0>file точно так же, как и cat filecat file>&1 точно так же, но мне кажется, что я не прав ...

К моему удивлению, cat 1>file и cat > file - это то же самое. Зачем?

+0

'>' не является конкатенацией: он перезаписывается. Конкатенация - '>>'. – Ruslan

+0

@ Руслан ОК. 'cat 0 >> file' тоже не работает. – Yves

+0

Что вы пытаетесь достичь? Какова логика попытки «cat» stdin и файла? – PeterK

ответ

3

Синтаксис 0>file перенаправляет stdin в файл (если это имеет смысл). Затем cat пытается прочитать от stdin и получает ошибку EBADF, потому что stdin больше не является входным потоком.

EBADF - fd is not a valid file descriptor or is not open for reading.

Обратите внимание, что переназначения (< и>) обрабатываются оболочкой, кот не видит 0>file немного.

+0

, поэтому мы не можем писать команды типа '0> ...', но мы можем написать '1> ...' и '2> ...', что означает, что stdout и stderr являются допустимыми файловыми дескрипторами, тогда как stdin не является ? – Yves

+1

@Thomas Я не могу объяснить это лучше, чем http://www.tldp.org/LDP/abs/html/io-redirection.html –

+0

Возможно, что 'stdin' будет перенаправлен в файл, но тогда код должен лечить 'stdin' как выходной поток, что довольно странно. –