Функция оболочки лучше, чем та же функция в PATH?

481
Léo Léopold Hertz 준영

Я был немного смущен по поводу постороннего использования функций оболочки.

Мое определение функции оболочки : функция в .bashrc такая, что

.bashrc

--- other default bash configs ----  extract() { // I call this a shell function .... } 

Мое определение функции помещено в PATH : файл, папка которого находится в PATH. Например, у нас есть файл ~ / bin / screen / convert.screen

Чтобы добавить файл и другие файлы в папке в мой путь, у меня может быть следующий путь

 export PATH='/Users/masi/bin/screen:' 

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

В чем преимущество пользовательской функции оболочки, которой нет в вашей переменной PATH?

1
Не могли бы вы уточнить? Мне трудно понять, что вы спрашиваете. Sasha Chedygov 14 лет назад 1
@musicfreak: я добавил свои определения данных функций в свой пост. Léo Léopold Hertz 준영 14 лет назад 0

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

4
John T

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

То есть вы имеете в виду, что приложения в ПУТИ не загружаются при входе в систему. Их имена вместо этого помещаются в список, который представляет программы в PATH. Если вы нажмете TAB, то этот список ищется. --- У меня никогда не было таких больших приложений оболочки, которые бы замедляли работу компьютера. Кажется, что лучше добавлять очень большие приложения оболочки в вашу переменную PATH, если они приводят к снижению скорости, в противном случае. Léo Léopold Hertz 준영 14 лет назад 0
1
nik

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

Если мы примем эту интерпретацию термина, то функции оболочки облегчат вашу жизнь с помощью «функций» в ваших скриптах и ​​командах.

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

Таким образом, функция оболочки - это функция, созданная в вашем PATH, так что вы можете загружать и вызывать ее при необходимости. Léo Léopold Hertz 준영 14 лет назад 0
@Masi, а также функция, написанная в вашем файле сценария, которая доступна для использования в нем. да. nik 14 лет назад 1
1
Telemachus

Я использую функции оболочки для вещей, которые достаточно малы и самодостаточны, и которые являются вспомогательными командами для оболочки, а не полными программами сами по себе. Когда что-то становится подходящей программой, я записываю ее как таковую и перемещаю в папку bin в моей $HOMEпапке (которая уже находится в моей PATH).

Вот пример:

# Start mpd (if necessary), search for music using mpc, play music. mp-start() { ps -C mpd > /dev/null || mpd mpc search any $1 | mpc add - mpc play } 

Это функция, а не программа. Это очень мало, и я собираюсь использовать его, только если я уже работаю в оболочке.

Я также считаю более чистым помещать все функции для моей оболочки в отдельный файл ( для меня .bash_functions, но я думаю, что вы - пользователь Z-оболочки, поэтому настройте его соответствующим образом), который я получаю из основного файла моей оболочки. Последний совет - добавить что-то вроде этого в ваши псевдонимы:

alias refunction='vim ~/.bash_functions; source ~/.bash_functions' 

Это позволяет вам создавать новую функцию на лету и иметь ее сразу же после завершения редактирования.