Из статьи в Википедии дистрибутивов Linux:
Дистрибутив Linux является членом семейства подобных Unix операционных систем, созданных сверху ядра Linux. Такими дистрибутивами (часто названный дистрибутивами, если коротко) являются Операционные системы включая большое количество приложений, такие как текстовые процессоры, электронные таблицы, медиаплееры и приложения базы данных.
То, что отличает их, является аппаратными средствами они supposrt, упаковка, патчи ядра, что устанавливает и версии приложений, они поставляют, их документация, устанавливают методы и т.д. Другие "классификации" - ориентированы ли они более к конечным пользователям или серверам.
Некоторые дистрибутивы (Debian, хинду, Fedora и другие) используются в качестве "начальной точки" для других дистрибутивов (Ubuntu получена из Debian, например). Это означает, что создатели, например, Sabayon Linux использовал хинду распределение, чтобы запустить их усилие по разработке и отслеживать эволюцию хинду в некоторой степени.
Можно посмотреть на страницу результатов поиска Distrowatch для этого вида примеров.
"ОСНОВАННЫЕ НА ОБ/МИН" дистрибутивы являются другой классификацией. Об/мин является системой управления пакета, не распределением. Некоторые дистрибутивы используют его (Redhat, и SuSe приходит на ум), непосредственно или через один из его frontends. Другие используют различные системы (pacman для Arch, перевозки для хинду). Система управления пакета является одним из важных различий между дистрибутивами.
Относительно версий нет никаких строгих критериев. Разработчики/менеджеры распределения выбирают то, что является присваивать версию/исправлять/новым программное обеспечение, которое они хотят включать в новую версию, полировать ее, и когда это готово, они поставляют ее. Нет последовательной схемы управления версиями через дистрибутивы.
Для Вашего последнего вопроса я не уверен, что понимаю, но Вы могли сказать, что Windows NT, 2000, XP, 2003/Vista, 2008 и Windows 7 является "версиями" Windows "распределение". И они - все в семействе Windows NT релизов Windows.
Таким образом, если Вы хотите провести параллель с дистрибутивами Linux, да, каждый, окна "выпуск" ближе к версии дистрибутива Linux. И происхождение "Windows NT" эквивалентно происхождению Redhat или SuSe, например.
(Одни из общих черт этих "происхождений" - то, что обычно существует главная версия ядра между релизами Windows, и это также имеет место для большого количества дистрибутивов Linux.)
Псевдоним не должен эффективно (в целом) делать больше, чем изменение опции по умолчанию команды. Это - не что иное как простая текстовая замена на названии команды. Это ничего не может сделать с аргументами, но передать их команде, которую это на самом деле выполняет. Таким образом, если просто необходимо добавить аргумент впереди единственной команды, псевдоним будет работать. Типичные примеры
# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"
Функция должна использоваться, когда необходимо сделать что-то более сложное, чем псевдоним кроме этого не был бы полезен самостоятельно. Например, возьмите этот ответ по вопросу, который я спросил об изменении grep
поведение по умолчанию в зависимости от того, является ли это в конвейере:
grep() {
if [[ -t 1 ]]; then
command grep -n "$@"
else
command grep "$@"
fi
}
Это - идеальный пример функции, потому что это слишком сложно для псевдонима (требующий различных значений по умолчанию на основе условия), но это не что-то, в чем Вы будете нуждаться в неинтерактивном сценарии.
Если Вы получаете слишком много функций или слишком больших функций, помещаете их в отдельные файлы в скрытом каталоге и получаете их в Вашем ~/.bashrc
:
if [ -d ~/.bash_functions ]; then
for file in ~/.bash_functions/*; do
. "$file"
done
fi
Сценарий должен стоять самостоятельно. Это должно иметь значение как что-то, что может снова использоваться или использоваться больше чем для одной цели.
Только добавить несколько примечаний:
sudo v /etc/rc.conf #where v runs vim in a new terminal window;
alias ls='ls --color=auto' #enable colored output;
# pressing key to open new terminal # waiting for a few seconds before shell prompt finally appears.
Кроме этого, Вы могли использовать самую простую возможную форму, т.е. сначала рассмотреть псевдоним, затем функционировать, затем сценарий.
sudo
. Но сначала Вам нужно alias sudo='sudo '
.
– Mikel
09.05.2012, 18:32
Сценарий и псевдоним и сценарий и функция не являются взаимоисключающими. Вы можете и действительно хранить псевдонимы и функции в сценариях.
Сценарии являются просто кодом, который сделан персистентным. Полезные функции и псевдонимы, которые Вам нравится использовать в будущем, хранятся в сценариях. Однако сценарий часто является набором больше чем одной функции.
Так как псевдонимы не параметризованы, они очень ограничены; обычно определять некоторые параметры по умолчанию.
Функция является отдельной единицей кода, четко определенным понятием нескольких строк кода, которые не могут разделенный на меньшие, полезные части; тот, который может быть снова использован непосредственно или другой другими функциями.
По крайней мере частично это - вопрос персонального вкуса. С другой стороны, существуют некоторые ясные функциональные различия:
Рассмотрение сценариев оболочки, я сделал последние несколько лет, которые я более или менее прекратил писать псевдонимам (потому что они все имеют тенденцию превращаться в функции со временем) и делает сценарии, только если они должны быть доступными также от сред неудара.
PS: что касается alias command="bash bashscriptname"
Я на самом деле не вижу оснований, чтобы сделать это. Даже если bashscriptname
не находится в $PATH, простом alias c=/path/to/script
был бы достаточно.
Я думаю, что это до вкуса каждого человека. Для меня логика идет как это:
Нет действительно ничего для ограничения Вас в выполнении чего-то, что работает.
Еще одна вещь, которой я не верю, была поднята: функция выполняется в контексте процесса вызова, тогда как сценарий разветвляет новую оболочку.
Это могло быть важно для производительности - функция быстрее, так как она не делает fork()
и exec()
. При нормальных обстоятельствах различие тривиально, но если Вы отлаживаете систему, которая является вне памяти и является перегрузкой страницы, это могло иметь большое значение.
Кроме того, если Вы хотите изменить свою текущую среду оболочки, необходимо использовать функцию. Например, функция могла изменить поиск команды $PATH
для текущей оболочки, но сценария не может, потому что она воздействует на копию ветвления/должностного лица $PATH
.
Другие ответы предоставляют некоторые мягкие общие руководящие принципы на основе персонального вкуса, но игнорируют много подходящих тех, что нужно рассмотреть при решении между сценариями, функциями или псевдонимами.
$PATH
поиск, много оболочек хранят хеш его пути в памяти, чтобы сэкономить время на будущем $PATH
поиски, но это - степень объема потребляемой памяти сценария, если не используемого.Сценарии могут быть вызваны большим количеством способов, чем функции и псевдонимы могут. Они могут быть переданы как аргумент интерпретатору, как sh script
, или вызванный непосредственно как исполняемый файл, в этом случае интерпретатор в строке хижины (например. #!/bin/sh
) вызывается для выполнения его. В обоих случаях скрипт запущен отдельным процессом интерпретатора с его собственной средой, отдельной от той из Вашей оболочки, на среду которой сценарий не может влиять всегда. Действительно, оболочка интерпретатора даже не должна соответствовать оболочке вызова. Поскольку сценарии вызвали этот путь, кажется, ведут себя как любой обычный исполняемый файл, они могут использоваться любой программой.
Наконец, скрипт может быть прочитан и запущен текущей оболочкой с .
, или в некоторых оболочках, source
. В этом случае сценарий ведет себя во многом как функция, которая читается по запросу вместо того, чтобы быть постоянно сохраненной в памяти.
Учитывая вышеупомянутое, мы можем придумать некоторые общие руководящие принципы для того, сделать ли что-то сценарием или функцией / псевдоним.
Другие программы помимо Вашей оболочки должны смочь использовать его? Если так, это должен быть сценарий.
Вы только хотите, чтобы это было доступно от интерактивной оболочки? Распространено хотеть изменить поведение по умолчанию многих команд, когда выполнено в интерактивном режиме, не влияя на внешние команды / сценарии. Для этого случая используйте псевдоним / функциональный набор в "единственном интерактивным режимом" емкостно-резистивном файле оболочки (для bash
это .bashrc
).
Это должно изменить среду оболочки? Оба функция / псевдоним или полученный сценарий являются возможным выбором.
Это - что-то, что Вы часто используете? Вероятно, более эффективно сохранить его в памяти, поэтому сделайте это функцией / псевдоним, если это возможно.
С другой стороны это - что-то, что Вы используете только редко? В этом случае нет никакого смысла, имеющего его память пожирателя ресурсов, когда Вам не нужен он, поэтому сделайте это сценарием.
¹, В то время как функции и псевдонимы имеют некоторые важные различия, они группируются, потому что функции могут сделать все, что псевдонимы могут. Псевдонимы не могут иметь локальных переменных, и при этом они не могут обработать аргументы, и они неудобны для чего-либо дольше, чем одна строка.
² Каждый рабочий процесс в системе Unix имеет среду, состоящую из набора variable=value
пары, которые часто содержат глобальные параметры конфигурации, как LANG
для локали по умолчанию и PATH
для определения исполняемого пути поиска.
alias g='gradle'
Я получаю gradle автозавершение при использовании моего g
псевдоним, но не получит его out-of-the-box при использовании сценария с gradle $*
или функция с gradle $@
– Yoav Aharoni
04.02.2018, 16:29
Если это должно быть очень быстро, сделайте это псевдонимом или функцией.
Если это должно быть применимо вне Вашей предпочтительной оболочки, сделайте это сценарием 1
Если это берет аргументы, сделайте это функцией или сценарием.
Если это должно содержать специальные символы, сделайте это псевдонимом или сценарием 2
Если это должно работать с sudo, сделайте это псевдонимом или сценарием 3
Если Вы хотите изменить его легко без того, чтобы выходить и зашедшего, сценарий легче 4
Сноски
1 Или делают это псевдонимом, вставляют его ~/.env
и набор export ENV="$HOME/.env"
, но это сложно, чтобы заставить его работать портативно.
2 Имени функций должны быть идентификаторами, таким образом, они должны начаться с буквы и могут только содержать буквы, цифры и символы нижнего подчеркивания. Например, у меня есть псевдоним alias +='pushd +1'
. Это не может быть функция.
3 И добавляют псевдоним alias sudo='sudo '
. Так же любая другая команда такой как strace
, gdb
, и т.д. это принимает управление как его первый аргумент.
4 См. также: fpath. Конечно, можно также сделать source ~/.bashrc
или подобный, но это часто имеет другие побочные эффекты.
+
в ударе. Интересно, после тестирования я обнаружил, что в ударе можно сделать +
псевдоним, но не функция, как Вы говорите, но zsh, является реверсом - +
может быть функция, но не псевдоним.
– Kevin
09.05.2012, 21:42
+
является портативным. Посмотрите спецификацию POSIX на Именах Псевдонима
– jw013
23.08.2012, 21:08
sudo
использование. Относительно сноски 4 я храню свои псевдонимы в ~/.bash_aliases
и функциональные определения в ~/.bash_functions
таким образом, я могу легко реsource
их (без любой опасности побочных эффектов).
– Anthony G - justice for Monica
19.11.2015, 13:15
Когда записать сценарий...
export
переменные редактора и/или функции передаются значением сценарию. Изменения в тех переменных не распространяют назад к родительскому сценарию.Когда записать функцию...
Когда записать псевдоним...
~/.profile
или ~/.bashrc
.В рамках сценариев как сценарии библиотеки иногда псевдоним для функции необходим, такой как тогда, когда функция переименована, но обратная совместимость требуется. Это может быть выполнено путем создания простой функции со старым названием, которое передает все его аргументы новой функции...
# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }
Вот некоторые дополнительные моменты о псевдонимы и функции:
Например:
alias f='echo Alias'; f # prints "Alias"
function f { echo 'Function'; }; f # prints "Alias"
unalias f; f # prints "Function"
Как мы видим, существуют отдельные пространства имен для псевдонимов и функций; более подробную информацию можно найти, используя declare -A -p BASH_ALIASES
и declare -f f
, которые выводят их определения (оба хранятся в памяти).
Пример, показывающий ограничения псевдонимов:
alias a='echo Alias'
a # OK: prints "Alias"
eval a; # OK: prints "Alias"
( alias a="Nested"; a ); # prints "Alias" (not "Nested")
( unalias a; a ); # prints "Alias"
bash -c "alias aa='Another Alias'; aa" # ERROR: bash: aa: command not found
Как мы видим, псевдонимы не являются вложенными, в отличие от функций. Также их использование ограничено интерактивными сессиями.
Наконец, обратите внимание, что вы можете выполнять произвольные вычисления в псевдониме, объявив функцию a, немедленно вызывающую ее, например:
alias a_complex_thing='f() { do_stuff_in_function; } f'
, которая уже широко используется в случае псевдонимов Git. Преимущество этого по сравнению с объявлением функции состоит в том, что ваш псевдоним не может быть просто перезаписан исходным (или использованием .
) сценария, который объявляет одноименную функцию.
Мое правило:
В многопользовательской (или многосисячной) среде я использую скрипты для всего, даже если это просто короткая обертка 'exec something....'.
Конечно, технически это медленнее/менее эффективно, чем псевдоним или функция, но это почти никогда не имеет значения - и если скрипт находится в пути, он всегда работает.
Ваша функция может быть вызвана из cron, из чего-то с урезанным или измененным окружением, таким как sudo или env, или пользователь может просто использовать другой shell, чем вы - все это может привести к поломке псевдонима или функции.
Если у вас есть что-то чувствительное к производительности, обрабатывайте это как особый случай, или, что еще лучше, считайте это триггером для переписывания на более функциональном языке сценариев.
Если мы говорим о функциях, которые будут использоваться только в других сценариях, то вы также можете рассмотреть возможность определения стандартной оболочки и написания сценария библиотеки функций, который может быть использован во всех других сценариях.
T
Я знаю, что это старый пост, но я хотел бы указать на ситуацию, когда мне почти пришлось использовать комбинацию псевдонима со сценарием, и я решил не использовать функцию.
У меня есть сценарий в ~ / .bin /
под названием setup
, который выполняет следующие действия: 1
Дело в том, , что если бы я просто запустил setup
, у меня бы не были определены эти переменные, и я бы не попал в каталог по адресу все. Лучшим решением, которое я нашел, было добавить этот сценарий в PATH
и добавить alias setup = ". ~ / .Bin / setup"
в ~ / .bashrc
или что-то еще.
- Сценарий доступен в моем репозитории файлов точек в папке
.bin /
.- О сценарии : Я даю этому сценарию аргумент, который является именем проекта, который я определил в расширенном режиме. Впоследствии сценарий знает, что нужно привести меня в нужный каталог в соответствии с определенным файлом
csv
. Переменные, которые он определяет, берутся из make-файла в этом каталоге. Затем сценарий запускаетсяls -l
иgit status
, чтобы показать мне, что там происходит.- Этот сценарий также доступен в моем репозитории dotfiles под
.bin /
.
Я могу прокомментировать только свое личное использование псевдонимов (, особенно если вы медленно работаете с клавиатурой, как я. Или не может коснуться типа. Тоже как я )Мне гораздо проще использовать псевдонимы для захвата редко используемых, но сложных команд, особенно таких, как:alias dockpurge='docker rmi $(docker images | grep "^<none>" | awk "{print $3}")'
которым я редко пользуюсь, но никто -и -менее не находит полезным.
Или даже часто используемые команды, которые мне проще связать с несколькими нажатиями клавиш, такими как:alias mcpi='mvn clean compile package install'
потому что я такой ленивый :)Если подытожить, то использование псевдонима является личной комбинацией собственного здравого смысла и личного вкуса(лучших практик несмотря на ).
.
илиsource
– сценарий выполняется отдельным процессом удара и имеет свою собственную среду. Поэтому что-либо, что изменяет среду оболочки (например, функции, переменные, и т.д.) не сохранится в среде оболочки, от которой Вы запускаете скрипт. – Will Vousden 05.03.2015, 13:02