Потому что sort реализована таким образом, что анализирует их так, как вы ожидаете.
Смотрите также здесь:
- Иногда параметры и их аргументы запускаются вместе, иногда разделяются пробелами, а иногда символом, обычно: или =. Таким образом, «Prog -fFilename», «Prog -f Filename», «Prog -f: Filename», «Prog -f = Filename».
- Некоторые программы позволяют комбинировать односимвольные параметры; другие нет. Переключатель «-fA» может означать то же самое, что и «-f -A», или он может быть неправильным, или это может быть даже допустимый, но другой параметр.
Это выглядит как комбинация обоих (работает без пробелов, и комбинация односимвольных опций).
Это просто разные программы, разбор аргументов которых реализован по-разному.
В coreutils 8.13 сравните следующее:
src/sort.c строка 4315, вызывающая специальную целочисленную функцию синтаксического анализа parse_field_count , которая возвращается с первым недопустимым символом (т. е. после завершения числового значения и запуска следующей опции): поэтому sort может обрабатывать ваши аргументы.
src/cut.c , строка 803 и далее, просто используя обычное поведение getopt интерпретирующее все до следующего пробела в качестве параметра текущей опции.