Почему cat не использует параметры так, как я ожидаю, что программы UNIX будут использовать переключатели?

364
Chas. Owens

Я был пользователем UNIX больше лет, чем мне хотелось бы думать, и за это время меня научили ожидать, что, когда программа получает противоречивые переключатели, побеждает последняя. Недавно я заметил, что

cat -bn file 

а также

cat -nb file 

оба используют -bопцию (число непустых строк) над -nопцией (нумерация всех строк). Такое поведение наблюдается как в BSD, так и в Linux, поэтому я не думаю, что это особенность реализации. Это что-то, что указано где-то, и я просто схожу с ума, ожидая, что первый пример будет нумеровать все строки?

4
Вы говорите, что `-b` обозначает пустые строки. Это на самом деле приводит к тому, что ** непустые ** строки нумеруются в соответствии с каждой man-страницей, на которую я смотрел (Ubuntu / GNU, FreeBSD, HP / UX). Dennis Williamson 13 лет назад 0
@ Денис Уильямсон, да, вы правы, это опечатка. Chas. Owens 13 лет назад 0

2 ответа на вопрос

5
coneslayer

Я взглянул на исходный код FreeBSD для cat (1), и соответствующие исходные строки:

case 'b': bflag = nflag = 1; /* -b implies -n */ 

Так что это выглядит как обдуманное дизайнерское решение; интерпретация -bявляется то, что она изменяет поведение -n, а не -bи -nбыть два взаимоисключающих альтернатив.

Это странное решение, потому что они задокументированы так, что ведут себя по-разному (нумерация всех строк против нумерации пустых строк). Если бы `-n` были задокументированы как" числовые строки "без слова" все ", я бы согласился с кодом. Хм, но, глядя на справочную страницу BSD, там написано «Нумерация выходных строк, начиная с 1», так что это действительно просто проблема с документацией GNU cat. Chas. Owens 13 лет назад 0
1
kmarsh

Большинство системных команд используют стандартную библиотеку C getopt (3) или какой-либо вариант и анализируют параметры слева направо. Итак, как вы заметили, последний побеждает.

Такое поведение он ожидает, но в случае, о котором он спрашивает, последний не выигрывает. coneslayer 13 лет назад 0
Вы уже рассмотрели это. Я объяснял, почему обычный механизм обычно предпочитает самые правые аргументы. kmarsh 13 лет назад 0

Похожие вопросы