Intereting Posts

Почему знак «меньше» не работает в качестве замены кошки в bash?

Я слышал о «бесполезном использовании кошки» и нашел некоторые предложения, но следующие результаты ничего не выводят в моей оболочке bash.

< filename 

Использование кошки работает, как ожидалось.

 cat filename 

Я использую Fedora Core 18 и GNU bash, версия 4.2.45 (1).

EDIT: Использование его перед трубой не работает.

 < filename | grep pattern 

Принимая во внимание, что использование кошки работает так, как ожидалось.

 cat filename | grep pattern 

EDIT2: Чтобы уточнить, я знаю, что могу использовать это

 grep pattern < filename 

но я прочитал здесь https://stackoverflow.com/questions/11710552/useless-use-of-cat, что я также могу использовать его перед командой. Однако он не работает перед командой.

Менее чем и символ ( < ) открывает файл и присоединяет его к стандартным дескрипторам ввода некоторых приложений / программ. Но вы не предоставили оболочке какое-либо приложение для присоединения ввода.

пример

Эти 2 примера делают практически одно и то же, но вводят их в 2 немного разных манерах.

открывает файл

 $ cat blah.txt hi 

открывает STDIN

 $ cat < blah.txt hi 

Подглядывание за занавеской

Вы можете использовать strace чтобы посмотреть, что происходит.

Когда мы читаем из файла

 open("blah.txt", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0664, st_size=3, ...}) = 0 fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0 read(3, "hi\n", 65536) = 3 write(1, "hi\n", 3hi ) = 3 read(3, "", 65536) = 0 close(3) = 0 close(1) = 0 

Когда мы читаем STDIN (обозначается как 0)

 read(0, "hi\n", 65536) = 3 write(1, "hi\n", 3hi ) = 3 read(0, "", 65536) = 0 close(0) = 0 close(1) = 0 

В первом примере мы видим, что cat открыл файл и прочитал его, blah.txt . Во втором мы видим, что cat считывает содержимое файла blah.txt через дескриптор файла STDIN, обозначенный как дескриптор номер 0.

 read(0, "hi\n", 65536) = 3 

Классическое бесполезное использование cat – это когда вы используете его для ввода программ, которые отлично способны открывать файлы напрямую. Например:

Плохо

 cat file | grep foo cat file | while read line; do echo "$line"; done cat file | sed 's/a/b/' cat file | awk '{print $1}' 

Хорошо

 grep foo file while read line; do echo "$line"; done < file sed 's/a/b/' file awk '{print $1}' file 

Также хорошо ( <file может быть с обеих сторон команды)

 <file grep foo sed 's/a/b/' < file <file awk '{print $1}' 

UUOC находится в:

 cat somefile | some-cmd 

или

 cat < somefile | some-cmd 

Там some-cmd читает содержимое somefile из канала, который кормит cat который сам читает его из somefile .

some-cmd может читать непосредственно из somefile (после того, как оболочка открыла его для него на stdin), cat не нужно:

 some-cmd < somefile 

или

 < somefile some-cmd 

(перенаправления могут появляться в любой точке простой командной строки).