
У меня в файле .bash_aliases определено более 150 сочетаний клавиш. Некоторые из них — простые команды, например:
# Opens file with default program
o () { xdg-open "$@" & disown; }
# Folder shortcuts
alias ..='cd .. && ls'
Другие вызывают скрипт, который находится где-то в другом месте на машине, например:
alias i3exit='~/.config/i3/i3exit.sh'
А другие представляют собой более крупные скрипты, определенные подобно o
команде выше, только содержащие 30–80 строк.
В чем разница между скриптом, определенным непосредственно как функция bash, и псевдонимом, который вызывает скрипт из другого файла? Является ли один из них предпочтительнее другого, и если да, то почему?
Интуиция подсказывает мне, что было бы лучше иметь отдельные файлы скриптов, но у меня нет никаких аргументов против этого.
решение1
Если вы определяете их в своем ~/.bash_aliases
файле, который является специфичным для Ubuntu и берется из ~/.bashrc
установки Ubuntu по умолчанию, то да, есть накладные расходы, поскольку файл будет брать каждый раз, когда вы запускаете новую интерактивную оболочку без входа в систему. Например, каждый раз, когда вы открываете новое окно терминала. Теперь, с современными машинами, эти накладные расходы, скорее всего, будут незаметны, но это может быть проблемой для старых машин, встроенных систем или если вы начнете иметьнагрузкисложных функций определены.
Кроме того, функции и псевдонимы, определенные таким образом, по умолчанию недоступны для скриптов. Поэтому, если вы хотите использовать одну из этих функций в своих скриптах, вам нужно будет явно указать source .bashrc
(или .bash_aliases
). Если они у вас есть как внешние файлы скриптов в вашем $PATH
, это не понадобится.
Мое личное правило сводится к сложности задействованных команд и к тому, будет ли функция/скрипт, который я пишу, полезен для неинтерактивных оболочек (например, других скриптов). Если я обнаруживаю, что пишу несколько десятков строк кода, то, скорее всего, перенесу это в скрипт. Если я пишу что-то, что может быть использовано во многих различных контекстах и, скорее всего, может пригодиться при написании другого скрипта, то, опять же, я перенесу это в скрипт.
Однако, если мне нужна простая маленькая функция, как та, которую вы показываете в своем вопросе, которая действительно полезна только при интерактивном запуске, то я буду придерживаться функций. Так что это действительно вопрос ваших личных предпочтений и рассмотрения того, как и когда вы захотите использовать функции, которые вы определяете.