псевдонимы bash, не распознаваемые функцией bash: sunspot_rails, jruby, rspec

Приведенные ниже псевдонимы для запуска sunspot в фоновом режиме работают. Приведенные ниже псевдонимы для поиска и уничтожения этих экземпляров работают. Переменные ENV для портов sunspot доступны. .

$user_id устанавливается перед вызовом этого sunspot_ports() и печатается правильно, когда первый вход в rebash является псевдонимом для источника ~.bashrc

У меня также есть псевдонимы для разработки и производства - это просто репрезентативный код.

sunspot_ports ()
{  
  #alias sunspot_run_test to the user's port
  sunspot_test_port=$(($user_id +5300))
  echo "Your sunspot test port: $sunspot_test_port"
  alias sunspot_run_test="RAILS_ENV=test sunspot-solr run -p${sunspot_test_port} &"
  alias sunspot_kill_test="fuser -n tcp ${sunspot_test_port} -k"

  export sunspot_production_port sunspot_development_port sunspot_test_port
}

solr_test()
{
  #only makes the aliases be recognized when it is outside the function
  #rebash
  #aliases not recognized without a rebash prior to the function 
  sunspot_run_test
  #commands not recognized even with rebash
  #"RAILS_ENV=test sunspot-solr run -p${sunspot_test_port} &"
  sleep 10;
  "$@";
  sunspot_kill_test;
  #commands not recognized even with rebash
  #"fuser -n tcp ${sunspot_test_port} -k"
}

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

Кроме того, мне нужно иметь это как функцию в .bashrc, а не где-то в моем коде jruby, поскольку jvm не допускает разветвления (в противном случае я бы просто использовал sunspot-solr start и sunspot-solr end в моих тестах спецификаций)


person C Del    schedule 07.12.2011    source источник


Ответы (1)


bash будет разрешать псевдоним только в том случае, если он уже определен во время первоначального источника вызова функции. Однако в вашем случае псевдоним определен в функции (sunspot_ports), и эта функция еще не была запущена к моменту получения solr_test.

У вас есть несколько вариантов:

  1. Вызовите sunspot_ports перед определением solr_test
  2. Замените свои псевдонимы функциями, например,
sunspot_kill_test()
{
   user -n tcp ${sunspot_test_port} -k
}
person Ray    schedule 08.12.2011
comment
Это имеет большой смысл (и, что более важно, работает). Большое спасибо. Я временно заставил его работать с помощью хака, который рекомендовал коллега $(sunspot_run_test) & .... $(sunspot_kill_test); чтобы запустить его в оболочке, но я сводил с ума, не зная, почему ресурсы bash работали раньше. - person C Del; 08.12.2011