Псевдоним Bash, вызывающий скрипт, по сравнению с определением скрипта как функции

Псевдоним Bash, вызывающий скрипт, по сравнению с определением скрипта как функции

У меня в файле .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, это не понадобится.

Мое личное правило сводится к сложности задействованных команд и к тому, будет ли функция/скрипт, который я пишу, полезен для неинтерактивных оболочек (например, других скриптов). Если я обнаруживаю, что пишу несколько десятков строк кода, то, скорее всего, перенесу это в скрипт. Если я пишу что-то, что может быть использовано во многих различных контекстах и, скорее всего, может пригодиться при написании другого скрипта, то, опять же, я перенесу это в скрипт.

Однако, если мне нужна простая маленькая функция, как та, которую вы показываете в своем вопросе, которая действительно полезна только при интерактивном запуске, то я буду придерживаться функций. Так что это действительно вопрос ваших личных предпочтений и рассмотрения того, как и когда вы захотите использовать функции, которые вы определяете.

Связанный контент