A função Shell no .bashrc não é reconhecida

0

Eu sei que isso deve ser algo bobo, mas de alguma forma eu estou preso tentando criar um atalho (alias) para uma função shell.

Aqui está o meu exato .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

Então, adicionei minha função r() no final do arquivo. Agora, quando digito r no shell, ainda recebo o erro:

-bash: r: command not found

Eu reiniciei o terminal, a janela do shell e ainda não houve efeito.

Estou no Mac OS 10.8.5 se isso for importante.

EDITAR

Depois de algumas pesquisas, encontrar esta questão sugerindo usar bash_profile em vez de bashrc , que agora está funcionando! Mas ... o que eu obtenho são os comandos listados mas não executados:

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

Esta é a execução normal do comando que eu esperava:

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$ 

Em vez disso, estou recebendo apenas o comando e nada mais. Alguma ideia do que está acontecendo?

    
por Dmitri Zaitsev 16.12.2013 / 10:57

2 respostas

1

Você deve usar, dentro do mesmo arquivo, a linha:

   export -f r

Editar:

Para verificar se isso funciona, você deve usar um shell diferente que você iniciou after de origem do seu .bashrc, para que ele possa ter herdado a função niew. Em staler shells, isso não funcionará.

Além disso, insira isto

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

no seu ~ / .bash_profile.

Se você deseja executar o programa iron_worker, então o corpo da função r deve ser:

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

Além disso, sugiro que você forneça o nome completo do caminho para o comando iron_worker, i.e. subsitute iron_worker com / path / to / iron_worker.

    
por 16.12.2013 / 11:56
1

Terminal e iTerm abrem novos shells como shells de login por padrão, então o bash lê ~/.bash_profile mas não ~/.bashrc .

Você pode:

  • Use ~/.bash_profile em vez de ~/.bashrc .
  • Adicione . ~/.bashrc a ~/.bash_profile .
  • Crie novos shells abertos com um shell que não seja de login, por exemplo, alterando "Shells open with" de "Default login shell" para o comando /bin/bash no Terminal.

Eu fiz os dois últimos. Por exemplo, o tmux e o modo shell no Emacs abrem novos shells de login como shells não-login por padrão. ~/.bash_profile ainda é lido quando eu ssh para o meu computador.

Consulte o link para obter mais informações.

A palavra-chave function na sua definição de função é redundante a propósito. function name() { :; } é idêntico a name() { :; } no bash. A palavra-chave function não está definida por POSIX.

    
por 16.12.2013 / 12:33