Не следует делать поведение утилиты зависящим от имени, использованного для ее вызова. Иногда бывает полезно сделать ссылки на утилиту с различными именами, но работа программы не должна зависеть от этого имени.
Вместо этого следует использовать передачу опции программе при запуске, либо по разному ее компилировать, либо и то, и другое для выбора разных вариантов поведения программы.
Точно так же, не надо делать поведение программы зависящим от типа используемого выходного устройства. Независимость от устройств является важным принципом разработки систем; не следует пренебрегать им только для того, чтобы уберечь кого-либо от необходимости задать лишнюю опцию.
Если Вы считаете, что один вариант работы программы более полезен при выводе на терминал, а другой - при выводе в файл или конвейер, то обычно лучше сделать, чтобы умолчанию подразумевался вывод на терминал, и ввести опции для запроса других вариантов поведения программы.
Соображения совместимости требуют, чтобы некоторые программы зависели от типа устройства вывода. Будет ужасно, если ls или sh не будут делать то, к чему привыкли и чего ожидают от них все пользователи. В некоторых из этих случаев, мы добавляем альтернативную версию утилит, которая не зависит от типа выходного устройства. Например, мы предоставляем программу dir, которая работает почти как ls, но всегда имеет по умолчанию многоколоночный формат вывода.
Стоит следовать требованиям POSIX для опций командной строки в программах. Простейший способ сделать это состоит в использовании getopt для их разбора. Заметим, что GNU-версия getopt обычно допускает опции везде до тех пор, пока не встретится специальный аргумент '--'. Это не входит в требования POSIX и является GNU-расширением.
Следует определять опции с длинными именами, которые эквивалентны однобуквенным опциям в стиле Unix. Мы считаем, что это делает GNU более дружественным. Проще всего удовлетворить это требование, воспользовавшись функцией GNU getopt_long.
Одно из преимуществ опций с длинными именами состоит в том, что они могут быть последовательно согласованы в различных программах. Например, пользователь ожидает, что режим подробной выдачи информации о работе программы будет включаться в любой программе с помощью одной и той же опции, записываемой '--verbose'. Для достижения подобной совместимости загляните в таблицу длинных общих имен опций, когда будете выбирать названия опций в своей программе. Таблица приводится ниже.
Если Вы используете имена, которые еще не присутствуют в этой таблице, пошлите их список по электронной почте по адресу 'gnu@prep.ai.mit.edu' для того, чтобы их можно было внести в эту таблицу.
Обычно принято в качестве обычных аргументов программы задавать имена входных файлов; имена выходных файлов должны быть заданы с помощью опции (лучше всего выбрать для этого опцию -o). Даже если Вы разрешаете указывать имена выходных файлов как обычные аргументы в командной строке из соображений совместимости, все равно следует ввести дополнительно соответствующую опцию. Это приведет к большей согласованности различных GNU-утилит друг с другом, и упростит пользователям жизнь.
Программы должны поддерживать опцию '--version', которая приводит к печати номера версии программы на стандартный вывод и последующему успешному завершению, и опцию '--help', которая печатает информацию об использовании опций на стандартный вывод и так же успешно завершает выполнение программы. При использовании этих опций не должна выполняться ничего, кроме печати запрошенной информации.
'-a' в 'recode'.
'-A' в 'ptx'.
'-N' в 'tar'.
'-a' в 'du', 'ls', 'nm', 'stty', 'uname', и 'unexpand'.
'-a' в 'diff'.
'-A' в 'ls'.
'-a' в 'etags', 'tee', 'time'; '-r' в 'tar'.
'-a' в 'cp'.
'-l' в 'm4'.
'-a' в 'diff'.
'-W' в Make.
'-o' в Make.
'-B' в etags.
Используется в GDB.
Используется в GDB.
'-b' в 'tac'.
'-b' в 'cpio' и 'diff'.
используется в 'cpio' и 'tar'.
'-b' в 'head' и 'tail'.
'-b' в 'ptx'.
Используется в различных программах для того, чтобы уменьшить объем выдаваемой информации.
'-c' в 'head', 'split', и 'tail'.
'-C' в 'etags'.
'-A' в 'tar'.
Используется в различных программах для указания используемого каталога.
'-c' в 'chgrp' и 'chown'.
'-F' в 'ls'.
'-c' в 'recode'.
'-c' в 'su'; '-x' в GDB.
'-d' в 'tar'.
'-Z' в 'tar'.
'-A' в 'tar'.
'-w' в 'tar'.
Используется в 'diff'.
'-C' в 'ptx' и 'recode'.
Используется в GDB.
'-q' в 'who'.
'-l' в 'du'.
Используется в 'tar' и 'cpio'.
'-x' в 'etags'.
'-d' в 'touch'.
'-d' в Make и 'm4'; '-t' в Bison.
'-D' в 'm4'.
'-d' в Bison и 'etags'.
'-D' в 'tar'.
'-L' в 'chgrp', 'chown', 'cpio', 'du', 'ls', и 'tar'.
'-D' в 'du'.
'-d' в 'recode'.
'-d' в 'look'.
'-d' в 'tar'.
'-n' в 'csplit'.
Указывается каталог для использования, применяется в различных программах. В 'ls' это означает показать сам каталог, а не его содержимое. В 'rm' и 'ln' это означает, что не надо особым образом обрабатывать ссылки на каталоги.
'-x' в 'strip'.
'-X' в 'strip'.
'-N' в 'm4'.
'-n' в Make.
'-e' в 'diff'.
'-z' в 'csplit'.
'-N' в 'diff'.
'-e' в Make.
'-e' в 'xargs'.
Используется в GDB.
Используется в Makeinfo.
'-o' в 'm4'.
'-b' в 'ls'.
'-X' в 'tar'.
Используется в GDB.
'-x' в 'xargs'.
'-t' в 'diff'.
'-e' в 'sed'.
'-g' в 'nm'.
'-i' в 'cpio'; '-x' в 'tar'.
'-f' в 'finger'.
'-f' в 'su'.
'-f' в 'info', Make, 'mt', и 'tar'; '-n' в 'sed'; '-r' в 'touch'.
'-b' в Bison.
'-F' в 'ls'.
'-T' в 'tar'.
Используется в Makeinfo.
'-F' в 'ptx'.
'-y' в Bison.
'-f' в 'tail'.
Используется в Makeinfo.
'-f' в 'cp', 'ln', 'mv', и 'rm'.
Используется в 'ls', 'time', и 'ptx'.
'-F' в 'etags'.
Используется в GDB.
'-g' в 'ptx'.
'-x' в 'tar'.
'-i' в 'ul'.
'-g' в 'recode'.
'-g' в 'install'.
'-z' в 'tar'.
'-H' в 'm4'.
'-h' в 'objdump' и 'recode'
'-H' в 'who'.
Используется для запроса краткой информации по использованию.
'-q' в 'ls'.
'-u' в 'who'.
'-D' в 'diff'.
'-I' в 'ls'; '-x' в 'recode'.
'-w' в 'diff'.
'-B' в 'ls'.
'-B' в 'diff'.
'-f' в 'look' и 'ptx'; '-i' в 'diff'.
'-i' в Make.
'-i' в 'ptx'.
'-S' в 'etags'.
'-f' в Oleo.
'-i' в 'tee'.
'-I' в 'diff'.
'-b' в 'diff'.
'-i' в 'tar'.
'-i' в 'etags'; '-I' в 'm4'.
'-I' в Make.
'-G' в 'tar'.
'-i', '-l', и '-m' в Finger.
'-i' в 'expand'.
'-T' в 'diff'.
'-i' в 'ls'.
'-i' в 'cp', 'ln', 'mv', 'rm'; '-e' в 'm4'; '-p' в 'xargs'; '-w' в 'tar'.
'-j' в Make.
'-n' в Make.
'-k' в Make.
'-k' в 'csplit'.
'-k' в 'du' и 'ls'.
'-C' в 'split'.
Используется в 'split', 'head', и 'tail'.
'-l' в 'cpio'.
'-t' в 'cpio'; '-l' в 'recode'.
'-t' в 'tar'.
'-N' в 'ls'.
'-l' в Make.
Используется в 'su'.
Список использующих программ не составлен.
'-M' в 'ptx'.
'-m' в 'hello' и 'uname'.
'-d' в 'cpio'.
'-f' в Make.
Используется в GDB.
'-n' в 'xargs'.
'-n' в 'xargs'.
'-l' в 'xargs'.
'-l' в Make.
'-P' в 'xargs'.
'-T' в 'who'.
'-T' в 'who'.
'-d' в 'diff'.
'-m' вn 'install', 'mkdir', и 'mkfifo'.
'-m' в 'tar'.
'-M' в 'tar'.
'-a' в Bison.
'-W' в Make.
'-r' в Make.
'-c' в 'touch'.
'-D' в 'etags'.
'-d' в 'cp'.
'-S' в Make.
'-l' в Bison.
'-e' в 'gprof'.
'-p' в 'nm'.
Используется в Makeinfo.
'-a' в 'gprof'.
'-E' в 'gprof'.
Используется в Makeinfo.
Используется в различных программах для подавления вывода предупреждающих сообщений.
'-n' в 'info'.
'-n' в 'uname'.
'-f' в 'cpio'.
'-n' в 'objdump'.
'-0' в 'xargs'.
'-n' в 'cat'.
'-b' в 'cat'.
'-n' в 'nm'.
'-n' в 'cpio' и 'ls'.
Используется в GDB.
'-o' в 'tar'.
'-o' в Make.
'-l' в 'tar', 'cp', и 'du'.
'-o' в 'ptx'.
'-f' в 'gprof'.
'-F' в 'gprof'.
В различных программах определяет имя выходного файла.
'-o' в 'rm'.
'-o' в 'install'.
'-l' в 'diff'.
Используется в Makeinfo.
'-p' в 'mkdir' и 'rmdir'.
'-p' в 'ul'.
'-p' в 'cpio'.
'-P' в 'finger'.
'-c' в 'cpio' и 'tar'.
'-P' в 'm4'.
'-f' в 'csplit'.
Используется в 'tar' и 'cp'.
'-p' в 'su'.
'-m' в 'cpio'.
'-s' в 'tar'.
'-p' в 'tar'.
'-l' в 'diff'.
'-L' в 'cmp'.
'-p' в Make.
'-w' в Make.
'-o' в 'nm'.
'-s' в 'nm'.
'-q' в Make.
Используется во многих программах для отключения вывода необязательных сообщений. Замечание: каждая программа, принимающая '--quiet', должна также принимать '--silent' как синоним.
'-Q' в 'ls'.
'-n' в 'diff'.
'-B' в 'tar'.
Используется в GDB.
'-n' в Make.
'-R' в 'tar'.
Используется в 'chgrp', 'chown', 'cp', 'ls', 'diff', и 'rm'.
Используется в Makeinfo.
'-r' в 'ptx'.
'-r' в 'tac'.
'-r' в 'uname'.
'-r' в 'objdump'.
'-r' в 'cpio'.
'-i' в 'xargs'.
'-s' в 'diff'.
'-a' в 'cpio'.
'-r' в 'ls' и 'nm'.
'-f' в 'diff'.
'-R' в 'ptx'.
'-s' в 'tar'.
'-p' в 'tar'.
'-g' в 'stty'.
Используется в GDB.
'-S' в 'ptx'.
'-S' в 'du'.
'-s' в 'tac'.
Используется 'recode' для выбора файлов или потоков для последовательной обработки.
'-s' в 'su'.
'-A' в 'cat'.
'-p' в 'diff'.
'-E' в 'cat'.
'-F' в 'diff'.
'-T' в 'cat'.
Используется во многих программах для отключения вывода необязательных сообщений. Замечание: каждая программа, принимающая '--silent', должна также принимать '--quiet' как синоним.
'-s' в 'ls'.
Используется в 'ls'.
'-S' в 'tar'.
'-H' в 'diff'.
'-s' в 'cat'.
Используется в 'tar' и 'diff' для указания, с какого файла в каком каталоге следует начать обработку.
'-S' в Make.
'-s' в 'recode'.
'-s' в 'install'.
'-s' в 'strip'.
'-S' в 'strip'.
'-S' в 'cp', 'ln', 'mv'.
'-b' в 'csplit'.
'-s' в 'gprof'.
'-s' в 'du'.
'-s' в 'ln'.
Используется в GDB и 'objdump'.
'-s' в 'm4'.
'-s' в 'uname'.
'-t' в 'expand' и 'unexpand'.
'-T' в 'ls'.
'-T' в 'tput' и 'ul'.
'-a' в 'diff'.
Используется в 'ls' и 'touch'.
'-O' в 'tar'.
'-c' в 'du'.
'-t' в Make, 'ranlib', и 'recode'.
'-t' в 'm4'.
'-t' в 'hello'; '-G' в 'm4' и 'ptx'.
Используется в GDB.
'-t' в 'etags'.
'-T' в 'etags'.
'-t' в 'ptx'.
'-z' в 'tar'.
'-u' в 'cpio'.
'-U' в 'm4'.
'-u' в 'nm'.
'-u' в 'cp', 'etags', 'mv', 'tar'.
Печатать дополнительную информацию о работе программы. Многие программы поддерживают эту опцию.
'-W' в 'tar'.
Печать номера версии программы.
'-V' в 'cp', 'ln', 'mv'.
'-v' в 'etags'.
'-V' в 'tar'.
'-W' в Make.
'-w' в 'ls' и 'ptx'.
'-W' в 'ptx'.
'-T' в 'who'.
'-z' в 'gprof'.