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

Вот мой точный .bash_profile:


[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
alias l="ls -G"
r () {
   echo "iron_worker upload $1"
   echo "iron_worker queue $1"
}
export -f r

Поэтому я добавил свою функцию r() в конец файла. Теперь, когда я набираю r в оболочке, я все равно получаю ошибку:

-bash: r: command not found

Я перезапустил терминал, окно оболочки, и все еще никакого эффекта.

Я на Mac OS 10.8.5, если это имеет значение.

РЕДАКТИРОВАТЬ.

После некоторого поиска нашел этот вопрос, предлагая использовать bash_profile вместо bashrc , который сейчас работает! Но ... то, что я получаю, это команды, перечисленные, но не выполненные:

Dmitris-MacBook-Pro:~ dmitrizaitsev$ r
iron_worker upload 
iron_worker queue 

Это нормальное выполнение команды, которое я ожидал:

Dmitris-MacBook-Pro:~ dmitrizaitsev$ iron_worker upload
Please specify code package name or path to workerfile
usage: iron_worker upload CODE_PACKAGE_NAME_OR_PATH_TO_WORKERFILE [OPTIONS]
    -n, --name NAME                  override code name
    -c CONCURRENCY,                  max number of concurrent workers for this code package
        --max-concurrency
    -r, --retries NUM_RETRIES        max number of automatic retries on task fail
    -d RETRIES_DELAY,                delay between each automatic retry
        --retries-delay
        --worker-config CONFIG_FILE  config file for worker
    -h, --host HOST                  host name, eg: www.mydomain.com
    -a, --async                      don't wait for package build
        --full-remote-build          activate full remote build
        --config CONFIG              config file
    -e, --env ENV                    environment
        --project-id PROJECT_ID      project id
Dmitris-MacBook-Pro:~ dmitrizaitsev$ 

Вместо этого я получаю только команду и ничего больше. Есть идеи, что происходит?

2 ответа2

1

Внутри того же файла вы должны использовать строку:

   export -f r

Редактировать:

Чтобы убедиться, что это работает, вы должны использовать другую оболочку, которую вы запустили after того, как вы получили ваш .bashrc, чтобы он мог унаследовать функцию niew. В скорлупе это не будет работать.

Кроме того, вставьте это

   if [ -f ~/.bashrc ]; then
       source ~/.bashrc
   fi

в вашем ~/.bash_profile.

Если вы хотите запустить программу iron_worker, то тело функции r должно быть:

   r () {
   iron_worker upload $1
   iron_worker queue $1
   }

Кроме того, я предлагаю вам указать полный путь к команде iron_worker, i.e. подставить iron_worker с помощью /path /to /iron_worker.

1

Терминал и iTerm по умолчанию открывают новые оболочки в качестве оболочек входа в систему, поэтому bash читает ~/.bash_profile но не ~/.bashrc .

Вы также можете:

  • Используйте ~/.bash_profile вместо ~/.bashrc .
  • . ~/.bashrc в ~/.bash_profile .
  • Откройте новые оболочки с помощью оболочки, не входящей в систему, например, изменив «Оболочки, открытые с» с "Оболочка входа по умолчанию" на команду /bin/bash в Терминале.

Я сделал последние два. Например, tmux и режим оболочки в Emacs по умолчанию открывают новые оболочки входа в систему как оболочки без входа в систему. ~/.bash_profile все еще читается, когда я ssh на мой компьютер.

См. Https://www.gnu.org/s/bash/manual/html_node/Bash-Startup-Files.html для получения дополнительной информации.

Кстати, ключевое слово function в вашем определении функции избыточно. function name() { :; } идентичен name() { :; } в баш. Ключевое слово function не определено POSIX.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .