La función de shell en .bashrc no se reconoce

0

Sé que esto debe ser algo tonto, pero de alguna manera estoy atascado tratando de crear un acceso directo (alias) para una función de shell.

Aquí está mi exacto .bash_profile:

[[-s "$ HOME / .rvm / scripts / rvm"]] && source "$ HOME / .rvm / scripts / rvm" # Carga RVM en una sesión de shell * como una función *
alias l = "ls -G"
r () {
   echo "iron_worker upload $ 1"
   echo "iron_worker queue $ 1"
}
export -fr

Entonces agregué mi función r()al final del archivo. Ahora, cuando escribo ren el shell, sigo recibiendo un error:

-bash: r: command not found

He reiniciado el terminal, la ventana de shell y todavía no tengo ningún efecto.

Estoy en Mac OS 10.8.5 si eso importa.

EDITAR.

Después de algunas búsquedas, encontré esta pregunta sugiriendo usar en bash_profilelugar de bashrc, ¡que ahora está funcionando! Pero ... lo que obtengo son los comandos enumerados pero no ejecutados:

Dmitris-MacBook-Pro: ~ dmitrizaitsev $ r
carga de iron_worker 
cola de iron_worker 

Esta es la ejecución normal del comando que esperaba:

Dmitris-MacBook-Pro: ~ dmitrizaitsev $ iron_worker upload
Especifique el nombre del paquete de código o la ruta al archivo de trabajo
uso: iron_worker upload CODE_PACKAGE_NAME_OR_PATH_TO_WORKERFILE [OPCIONES]
    -n, --name NAME anula el nombre del código
    -c CONCURRENCIA, número máximo de trabajadores concurrentes para este paquete de código
        --max-concurrencia
    -r, --retries NUM_RETRIES número máximo de reintentos automáticos en caso de error de tarea
    -d RETRIES_DELAY, retraso entre cada reintento automático
        --retry-delay
        --worker-config CONFIG_FILE archivo de configuración para trabajador
    -h, --host nombre de host HOST, por ejemplo: www.midominio.com
    -a, --async no espere la compilación del paquete
        --full-remote-build activa la compilación remota completa
        --config CONFIG config file
    -e, --env entorno ENV
        --project-id ID de proyecto PROJECT_ID
Dmitris-MacBook-Pro: ~ dmitrizaitsev $ 

En cambio, solo recibo el comando y nada más. ¿Alguna idea de lo que está pasando?

Dmitri Zaitsev
fuente
intente obtener su archivo .bashrc
MariusMatutiae
@MariusMatutiae El archivo está en mi directorio de usuario ~/y el contenido es como en la pregunta. ¿Es eso lo que quieres decir?
Dmitri Zaitsev
Lo que quiero decir es: sh .bashrc
MariusMatutiae
@MariusMatutiae hizo eso, sigue siendo el mismo resultado :(
Dmitri Zaitsev
jajaja ¿qué caparazón estás usando ahora?
MariusMatutiae

Respuestas:

1

Debe usar, dentro del mismo archivo, la línea:

   export -f r

Para comprobar que esto funciona, debe usar un shell diferente que haya comenzado afterpara obtener su .bashrc, de modo que pueda haber heredado la nueva función. En proyectiles staler, esto no funcionará.

Además, inserte esto en su ~/.bash_profile:

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

Si desea ejecutar el programa iron_worker, el cuerpo de la función r debería ser:

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

Además, le sugiero que proporcione la ruta completa al comando iron_worker (es decir, sustitúyala iron_workerpor /path/to/iron_worker).

MariusMatutiae
fuente
Añadido y aún sin efecto. También noté que los alias alias l="ls"dentro del mismo archivo tampoco funcionan :(
Dmitri Zaitsev
Ok, pensé que necesitaba hacerlo source .bashrc, entonces funciona. Pero no se activa automáticamente en el nuevo shell a menos que lo vuelva a hacer :( ¿Hay alguna forma de obtenerlo automáticamente?
Dmitri Zaitsev
De alguna manera, lo que obtengo es lo contrario: funciona en la misma ventana después del abastecimiento, pero no en una nueva.
Dmitri Zaitsev
@DmitriZaitsev, comprueba mi nueva edición.
MariusMatutiae
Consulte mi edición. ¿Quizás la definición de la función es un problema?
Dmitri Zaitsev
1

Terminal e iTerm abren nuevos shells como shells de inicio de sesión de forma predeterminada, por lo que bash lee ~/.bash_profilepero no ~/.bashrc.

Tu también puedes:

  • Usar en ~/.bash_profilelugar de ~/.bashrc.
  • Añadir . ~/.bashrca ~/.bash_profile.
  • Abra nuevos shells con un shell que no sea de inicio de sesión, por ejemplo cambiando "Shells open with" de "Shell de inicio de sesión predeterminado" al comando /bin/bashen Terminal.

He hecho los dos últimos. Por ejemplo, tmux y el modo de shell en Emacs abren nuevos shells de inicio de sesión como shells sin inicio de sesión de forma predeterminada. ~/.bash_profiletodavía se lee cuando ssh a mi computadora.

Consulte https://www.gnu.org/s/bash/manual/html_node/Bash-Startup-Files.html para obtener más información.

La functionpalabra clave en su definición de función es redundante por cierto. function name() { :; }es idéntico a name() { :; }en bash. La functionpalabra clave no está definida por POSIX.

Lri
fuente