2015-02-24 5 views
4

Я переписываю утилиту GNU wc на другом языке, и я наткнулся на эту команду, которую должен вызвать wc для вывода 0 байтов.Что делает эта команда оболочки?

(dd ibs=99k skip=1 count=0; ./wc -c) < /etc/group

В настоящее время я понимаю, dd запускается в отдельном (суб) оболочки, затем wc запускается, а затем содержимое /etc/group перенаправляются внутри оболочки?

Команда dd использует размер входного блока 99 КБ и пропускает один из них перед чтением ввода? Вот где я сработал.

В настоящее время моя версия сообщает ~ 980 байт, поэтому я хотел бы лучше понять эту команду, чтобы моя утилита могла это отразить.

+2

Осторожно: вуду. – bishop

+0

Ваш файл '/ etc/group' ~ 980 байт? –

+0

@ EtanReisner yep. –

ответ

4

Эта команда (dd ibs=99k skip=1 count=0; ./wc -c) < /etc/group порождает суб-оболочку (для (list)) и прикреплена к стандартным входам подкланов /etc/group.

Внутри что суб-оболочки команда dd запускается (и наследует стандартный ввод суб-командного интерпретатора) с размером входного блока в 99k отсчету пропуском 1 и блоков, чтобы скопировать счетчик 0. Это заставит dd искать 99k в свой стандартный поток ввода и останов. Когда это будет завершено, тогда будет запущен wc (и наследует стандартный ввод суб-оболочки) и сообщает количество символов, оставшихся в считываемом потоке (что для всех, кроме , огромное количество файлов будет ничем).

Реализована ли ваша реализация wc в начале дескриптора файла?

+0

Моя реализация wc - нет. Спасибо. Я отвечу, как только мне позволено. –

+0

О, странно @ jm666. (dd ibs = 99k skip = 1 count = 0; wc -c)

+0

@ jm666 Даже с пропуском? Потому что это не то, что я вижу здесь. Какой 'dd' вы используете? (Я совсем не уверен, что 'dd' должен делать там, но я бы подумал, что он должен искать и останавливать, что я вижу.) –

1

Команда dd используется как входной сигнал /etc/group. С этими аргументами у нас есть файл блока 99k, 1 блок 99k пропущен из-за ibs argument, а затем скопированы 0 блоков 99k. Затем вы используете свою команду ./wc -c с результатом этой команды в качестве входных данных. В конце концов, dd достигает, чтобы игнорировать блок 99k, а затем загружать оставшиеся данные в вашу пользовательскую команду.

например.

$ wc -c /etc/group 
1011 /etc/group 
$ (dd ibs=500 skip=1 count=0; wc -c) < /etc/group 
511 

Конечно, вы будете ожидать разных результатов с помощью вашей команды пользовательских wc.

0

Осторожно, это зависит от реализации

Использование примера @ nalipar на моем OS X.

$ wc -c /etc/group 
    2317 /etc/group 

$ gwc -c /etc/group #the GNU version of the wc 
2317 /etc/group 

система по умолчанию wc

(dd ibs=500 skip=1 count=0; wc -c) < /etc/group 

печатает

0+0 records in 
0+0 records out 
0 bytes transferred in 0.000012 secs (0 bytes/sec) 
    2317 

с использованием GNU wc

(dd ibs=500 skip=1 count=0; gwc -c) < /etc/group 
0+0 records in 
0+0 records out 
0 bytes transferred in 0.000013 secs (0 bytes/sec) 
1817 
Смежные вопросы