Распределение загружаемых встроенных модулей Bash

StackOverflow https://stackoverflow.com/questions/646010

Вопрос

Я написал встроенную утилиту для bash, которая изменяет команду 'cd', требование для моего программного обеспечения. Есть ли способ на самом деле распространять загружаемый независимо от самого Bash? В идеале я хотел бы распространить только каплю "дополнительная функция" потому что я знаю, что людей можно отложить, исправив и скомпилировав их оболочку из исходного кода.

Я хочу определить, сколько времени пользователь находится в каталоге, чтобы я мог определить, где он хочет быть. Вот эта функциональность > Переписан как встроенный bash, для проблем с производительностью. Эта реализация использует $ PROMPT_COMMAND для работы, но я хотел что-то интегрированное.

Это было полезно?

Решение

Непонятно, что вы изменили, но в любом случае bash (как минимум ksh93 , в котором IIRC представил концепцию, и zsh ) поддерживает, используя синтаксис enable -f имя файла , загрузку встроенных функций в качестве внешних динамически загружаемых модулей.

Эти модули, представляющие собой простые файлы, безусловно, могут распространяться независимо, если вы уверены, что они совместимы с целевой версией / архитектурой. Это было верно 5 лет назад, когда вы задавали этот вопрос.

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

Простой обходной путь - реализовать настроенный компакт-диск с другим именем, скажем, mycd, следующим образом:

int mycd_builtin(list)
WORD_LIST *list;
{
  int rv;
  rv=cd_builtin(list);
  if(rv == EXECUTION_SUCCESS) {
    char wd[PATH_MAX+1];
    getcwd(wd,sizeof(wd));
    // do your custom stuff knowing the new working directory
    ...
  }
  return (rv);
}

затем, чтобы использовать псевдоним или, что лучше, функцию оболочки для вашей настроенной версии, которая будет использоваться вместо обычной:

cd() {
  mycd "$@"
}

Пока ваша настройка не влияет на поведение стандартной команды и, следовательно, не рискует нарушить использование скриптов, в вашем подходе нет ничего плохого.

Другие советы

Изменение встроенного компакт-диска - кошмар поддержки для любого администратора и нежелателен для иностранных пользователей. Что плохого в том, чтобы назвать его «smart-cd» и позволить ПОЛЬЗОВАТЕЛЮ решить, хотят ли они эту функциональность, включив ее в свои .bashrc или .profile? Затем они могут настроить вещи так, как они хотят.

Кроме того, использование того, как долго вы были в каталоге, является довольно плохим показателем предпочтений. Как бы вы различали холостой ход (забытая оболочка, висящая в / tmp за ночь), долго выполняющиеся сценарии (ночные задания cron) и реальную активность.

Существует множество других способов создания ярлыков для избранных каталогов: псевдонимы, программные ссылки, $ VARIABLES, скрипты. С вашей стороны высокомерно предполагать, что ваши шаблоны использования будут приветствоваться другими пользователями вашей системы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top