почему команды * NIX имеют такие "безумные" (нелогичные) значения по умолчанию (философские размышления)?

624
NeuronQ

Почему большинство команд * NIX my (опыт работы с Linux в основном и редкое столкновение с FreeBDS) имеют такое «безумное» (не интуитивное) поведение по умолчанию, т.е. ОЧЕНЬ отличается от того, что будет делать «эквивалентное» действие GUI.

Наиболее очевидным примером является команда копирования файла, cpкоторая по умолчанию в Linux не делает (1) рекурсивное копирование каталогов (очевидно, нелогично для тех, кто приходит в оболочку из-за того, что ранее использовал графический интерфейс, где копирование / вставка копирует каталог и все в нем ) и (2) следуйте симлинкам (!!) вместо того, чтобы просто копировать их, как они есть (опять же, как и ожидал бы любой пользователь GUI). Таким образом, «нормальный» вариант, cpчто я воображаю должен быть по умолчанию что - то вроде: cp -r.

(И опять же, это не «предвзятая» перспектива, уникальная для тех, кто раньше использовал только графический интерфейс. copyНапример, команда DOS делает то, что вы ожидаете, например, эквивалент cp -rили cp -ra...)

Другой очевидный пример - это rmкогда rm -riто, что любой не-shell-гик будет ожидать по умолчанию.

И это продолжается с 90% всех команд * NIX, где получить то, что вы интуитивно ожидаете, по умолчанию, это то, чего вы достигнете, добавив еще несколько опций. И дело не в том, что опытный пользователь ожидает, что он станет по умолчанию, совсем не то, что делает новичок, например, cpи rmочевидно, что 99% времени cp -rи rm -rэто то, что вам нужно. И дело не в том, что для обратной совместимости нужно просто так оставаться, как вы можете просто создать новую оболочку и сохранить #/usr/bin/oldshellили что-то для старой.

Итак, еще раз, вопрос заключается в том, почему стандартные параметры / переключатели команд оболочки * NIX настолько далеки от того, что вы ожидаете интуитивно ожидать? Где я могу найти исторические аргументы о том, как обстоят дела (даже в анекдотических целях), и какова причина, кроме отвратительной обратной совместимости, для текущего положения вещей?


Нашел это на unix.stackexchange, который на самом деле отвечает на МНОГИЕ мои вопросы ...

4
Добро пожаловать в Superuser, пожалуйста, прочитайте, что [FAQ] (http://superuser.com/faq#dontask) говорит о «болтливых открытых вопросах» RedGrittyBrick 12 лет назад 0
С cp, я подозреваю, что команда предшествовала символическим ссылкам. Есть большая вероятность, что большинство людей, которые будут знать, почему что-то было сделано определенным образом, очень старые или мертвые. Хороший кусок команд может даже предшествовать Unix Journeyman Geek 12 лет назад 0
«Интуитивно» является субъективным. Я был бы ошеломлен, если бы `cp` был рекурсивным по умолчанию и сказал бы себе" почему, черт возьми, кто-то спроектировал это так ". Mat 12 лет назад 0
@JourneymanGeek ... чтобы понять, что ты имеешь в виду, мне потребовалось некоторое время, чтобы понять, что симлинки linux больше похожи на жесткие ссылки на приложения, а не на файлы ярлыков Windows (никогда об этом не думали) ... но опять же, история одна причина сохранения неинтуитивных значений по умолчанию? NeuronQ 12 лет назад 0
Абсолютно. Это означает, что команды, используемые в 70-х *, теперь будут работать * предсказуемым образом. И симлинки ближе к «указателям файловой системы», чем ярлык Windows. Симлинки НАМНОГО более мощные. Journeyman Geek 12 лет назад 0
@ Мат ... ПОЧЕМУ? В любой графической среде, когда вы копируете что-то, вы действительно ожидаете, что скопируете это (включая его содержимое). Почему ваши ожидания разные в оболочке. Даже в реальном мире, когда вы копируете лист бумаги, вы ожидаете, что у вас будет его копия, а не заголовок и подзаголовок вверху страницы ... NeuronQ 12 лет назад 0
@NeuronQ: Но, возможно, графические среды делают это неправильно; p Journeyman Geek 12 лет назад 2
@NeuronQ: Но чтобы копировать книгу в реальном мире, вы должны копировать каждую страницу, а не просто класть ее на копир :) choroba 12 лет назад 1
@choroba Хорошо, аналогия с бумагой / книгой в папке ничего не доказывает, мой плохой, ты прав. но главное остается в силе NeuronQ 12 лет назад 0
@JourneymanGeek GUI каким-то образом моделирует вещи по подобию объектов реального мира или взаимодействий реального мира ... и это всегда хорошо работало для создания интуитивных взаимодействий (возьмите старый добрый обмен сообщениями по электронной почте) ... оболочка, кажется, намеренно старается отличаться от возможно из любой часто используемой концепции или взаимодействия физического мира ... NeuronQ 12 лет назад 0
Какой твой главный смысл? * Ваши * ожидания ваши, от того, как вы узнали вещи. Видимо, я не учил вещи, как ты, и у меня были разные. Ваш "интуитивно понятный" - мой "WTF". Mat 12 лет назад 0
И именно поэтому это субъективно и, вероятно, будет закрыто; p Journeyman Geek 12 лет назад 0
@Mat Как дизайнер GUI / UX, я знаю, что 99% людей имеют общий набор интуиций, основанных на реальных физических взаимодействиях. Умные люди, такие как вы, без проблем думают в терминах абстрактных понятий, но 90% пользователей не имеют «абстрактной интуиции», которая могла бы свободно колебаться в любом направлении, у них есть интуиция, основанная на общем наборе понятий, и поэтому все Графические интерфейсы от Xerox до современных настольных компьютеров используют общий набор «интуитивно понятных» концепций ... Вы также можете отказаться от всех реальных аналогий при разработке графических интерфейсов и вместо этого черпать вдохновение из математической теории множеств :) NeuronQ 12 лет назад 0
@NeuronQ: это не имеет ничего общего с "умом". Вы предполагаете, что GUI каким-то образом "таков, каким должен быть", и что принципы дизайна, лежащие в их основе, должны в значительной степени править миром. Это не тот случай. Нет причин, по которым инструменты CLI следует моделировать с использованием тех же принципов проектирования, что и инструменты GUI (или наоборот). Разные варианты использования и разные целевые аудитории. Mat 12 лет назад 1
Общая идея, и нам «фанатам оболочки» очень нравится, как она есть, потому что: вещи хорошо документированы и ведут себя одинаково в разных средах (компьютерах). Если вы перетащите что-то в одно приложение, оно будет работать так, как вам удобно. Никто никогда не читает, как ведет себя GUI. И руководства пользователя дерьмо. ... В другом приложении (mac os - windows -gnome-kde) при перетаскивании результаты будут отличаться (подробности). Принимая во внимание, что cp ВСЕГДА будет делать то же самое, что и 40 лет. cp -r также будет делать то, что вы ожидаете. Если вы знаете, чего ожидать от этого - и вы делаете, если вы читаете справочную страницу. Ярослав Рахматуллин 12 лет назад 0
Во-первых, Becasue Unix хочет стандартизировать только один -r для «рекурсивного», необходимо запомнить, чтобы использовать его для grep, ls (R) / rm / cp и т. Д. 2-й, cp -nr (no_recursive) или cp -s (single) более безумный. В-третьих, rm -r более опасен, чем rm, это защита. В-четвертых, рекурсивный эквивалент концепции цикла в программировании, которая требует явного указания. 林果皞 8 лет назад 0

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

3
Ярослав Рахматуллин

Команды делают именно то, что от них ожидается. Вы можете узнать, что разумно ожидать от команды, посмотрев страницу руководства для этой команды.

НАПРИМЕР

man cp: -i, --интерактивная подсказка перед перезаписью (переопределяет предыдущую опцию -n)

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

alias rm="rm -i" alias cp="cp -r" 

Но это будет продолжаться только до тех пор, пока вы не выйдете из системы. Чтобы сделать эти параметры постоянными, вы можете поместить эти псевдонимы в файл, который будет читаться вашей оболочкой каждый раз, когда вы входите в систему. Если вы запускаете bash, вы можете поместить свои команды запуска в ~ / .bashrc. Как правило, ~ / .profile также является хорошим местом для размещения псевдонимов.


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

Ради доброй воли и приветствую вас в мире интерфейса командной строки, я дам вам пару моих любимых псевдонимов. И я дам вам, что cp -i и rm -i намного лучше использовать в качестве команд по умолчанию, потому что очень легко ошибиться и непреднамеренно удалить много файлов. Я не согласен с рекурсивным вариантом.

# basic file manipulation, etc alias cd....='cd ../..' alias cd...='cd ../..' alias cd..='cd ..' alias cd.='cd .' alias cd~='cd ~' alias ....='cd ../..' alias ...='cd ../..' alias ..='cd ..' alias ~='cd ~'  alias ls='ls --color=auto' alias l='ls -CF' alias l1='ls -1' alias ll='ls -l' alias lla='ls -la' alias la='ls -a'   alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias mc='mv -i'  alias md="mkdir" alias rd="rmdir"  alias less="less -i" alias bc="bc -q" alias KA="killall"  alias swipe='screen -wipe' alias sdr='screen -dR $1'  # and some functions:   spelling () { echo $@ | LC_ALL=en_US aspell -a; }  google-search () { BROWSER="firefox '%s' &" args="${@}"; args=`echo $args | sed 's/ /%20/g'`; url="https://www.google.no/search?hl=en&um=1&sa=1&q="; printf "$BROWSER\n" "$url$args" | sh } 
Спасибо! Но что должен делать псевдоним cd. = Cd.? Нет текущий реж? NeuronQ 12 лет назад 0
Раньше я забыл пробел или неправильно написал команду. Я не могу вспомнить, почему я думал, что псевдоним полезен, у меня это было несколько лет. Я не использую CD. больше. Я просто дал вам пару примеров ... Ярослав Рахматуллин 12 лет назад 0
Когда ваш текущий каталог был удален и воссоздан, `cd .` позволяет вам переключиться со старого устаревшего каталога на новый. BatchyX 12 лет назад 1
Да, хорошо, но как часто это происходит? Я думаю, что я имею в виду для CD. быть CD .. Ярослав Рахматуллин 12 лет назад 0
alias home = 'cd ~' - это благословение для тех, чья раскладка клавиатуры делает ввод текста тильдой болезненным. Bojan Markovic 11 лет назад 0
@BojanMarkovic, `~` является местоположением по умолчанию для `cd`, поэтому вам никогда не придется вводить` cd ~ `, потому что просто` cd` приведет вас туда. OmnipotentEntity 11 лет назад 1
@ ЯрославРахматуллин - Что касается `alias cd. = 'Cd .'` - возможно, потому что DOS и Windows` cmd.exe` позволяют вам делать `cd..` (привычка, которая у меня была до того, как я начал работать с Linux в начале 2000-х) но не "баш". LawrenceC 11 лет назад 0

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