¿Cómo agregar una función a .bash_profile / .profile / bashrc en shell?

24

Tengo una función que convierte el tiempo de época a la fecha. Aquí está la definición

date1(){
  date -d @$1
}

Me gustaría poder escribir:

$ date1 xxxyyy

Donde xxxyyy es el parámetro que paso a mi función para poder obtener la fecha correspondiente. Entiendo que tengo que añadir que, ya sea en .bash_profile, .profileo .bashrcya continuación la fuente él:

$ source file

Pero no estoy seguro de en qué archivo colocarlo. Actualmente, lo tengo .profile. Pero para ejecutarlo, tengo que hacerlo source .profiletodo el tiempo.

Idealmente, debería estar disponible cuando la computadora se inicia como la variable de entorno.

Tipo
fuente
para una muestra de entrada; 1.La salida de texto epochconverter.com ahora es 1514917788; 2.desde el propio bash $ date +% s por stackoverflow.com/questions/1092631/…
AnneTheAgile

Respuestas:

25

De man bash:

Cuando se invoca bash como un shell de inicio de sesión interactivo o como un shell no interactivo con la opción --login, primero lee y ejecuta comandos del archivo / etc / profile, si ese archivo existe. Después de leer ese archivo, busca ~ / .bash_profile, ~ / .bash_login y ~ / .profile, en ese orden, y lee y ejecuta comandos del primero que existe y es legible.

En otras palabras, puede ponerlo en cualquiera de ~/.bash_profile, ~/.bash_logino ~/.profile, o cualquier archivo sourced por cualquiera de esos . Por ~/.profilelo general , la fuente ~/.bashrc, que es el "archivo de inicialización personal, ejecutado para shells de inicio de sesión".

Para habilitarlo, inicie un nuevo shell, ejecute exec $SHELLo ejecute source ~/.bashrc.

l0b0
fuente
1
Bueno, intenté tu forma de crear una función personalizada de impresión de su argumento, pero incluso si agrego esa función .bash_profile, también tengo que hacerlo source ~/.bash_profilecada vez que abro el terminal mediante un acceso directo Ctrl+Alt+T.
Vicky Dev
@VickyDev Si tiene que hacerlo source ~/.bash_profilecada vez, entonces eso es una indicación de que su configuración de Bash de alguna manera no es estándar o está rota (según la man bashsalida mencionada). ¿Estás seguro de que realmente estás ejecutando Bash? Por ejemplo, ¿ echo $BASHPIDimprime algo?
l0b0
¿Necesita agregar #!/bin/shal principio de .profilepara definir una función?
Kolob Canyon
13

Después de definir la función en su .profile, agregue export -f date1. Esto exportará la función para que la use su shell de inicio de sesión.

DopeGhoti
fuente
+1 para la exportación, tuve que invocar y alias en ssh ProxyCommand, y seguía discutiendo sobre alias no encontrados incluso después de la fuente .profile. Funciona como un encanto después de la exportación.
Abhishek Anand
7

Entra en personalizaciones para shells interactivos ~/.bashrc. Las cosas que desea ejecutar cuando inicia sesión entran ~/.profile(o ~/.bash_profile, pero a menudo no se cargan al iniciar sesión gráficamente).

Ponga esta definición de función en ~/.bashrc.

Como bash no se carga .bashrccuando es un shell de inicio de sesión, forzarlo a hacerlo: escriba un ~/.bash_profilecontenedor

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

es decir ~/.profile, cargar , y también cargar ~/.bashrcsi el shell es interactivo.

Ver Alternativa a .bashrc y las publicaciones vinculadas allí.

Gilles 'SO- deja de ser malvado'
fuente
1

csh y tcsh no admiten funciones como bash, pero puedes hacerlo.

Por ejemplo, aquí hay una función simple para imprimir texto

alias print_hello_world 'eval echo "hello world"'

pasar argumentos al guión

repeate_after_me 'eval echo "$1"'

hacer código de varias líneas como una declaración if es un poco complicado, pero aquí tienes.

alias X 'eval "if (\!:1 =~ 'yes') then \\
          echo yes \\
          else \\
          echo no \\
          endif"'

aún tendrá que evaluar, pero la parte más compleja es hacer la \!:[x]sintaxis para obtener la entrada desde la línea de comandos.

Eso debería ser suficiente para resolverlo.

usuario1610950
fuente
0

Puede redirigir todas las funciones actuales a bashrc con typeset .

Por ejemplo, así es como estoy agregando una función de un comando openstack con parámetro opcional, en bashrc:

urc() { . stackrc; set -x; openstack server list --all $1; set +x; }
typeset -f >> ~/.bashrc

Ahora se guarda para futuras sesiones y se puede usar como:

$ urc 

o

$ urc --debug
Noam Manos
fuente
-1

punto 18: En mi memoria anterior cuando un administrador, aprender ksh y bash era lo contrario. 1: - / etc / los contenidos del perfil son sysWide. / etc / skel contenía el archivo dado a las nuevas cuentas. Desde Bash ahora primo común de toda distro. el siguiente sería 2: - ~ / .profile como estándar del sistema, entonces dentro del contenido de .profile "si existe" .bash_profile pondría -> 3: - .bash_profile 4: - .bash_login 5: -. bashrc .bash_aliases estaría en Me parece el orden más correcto, configurar el entorno estándar de Terminal y Shell y .bash_login habitual nunca encontrado o existente (es personalizado por usuario). Con .profile $ PATH siendo principal si el.
Estoy descubriendo que ahora también agrego .bash_profile .profile todavía domina y no respeta la presencia de .bash_profile. Junto con la información del encabezado, nadie está actualizando, es decir: bash startup Samples - esa estructura de directorios ya no está más - junto con ejemplos y / o archivos están comprimidos. Así que la actualización a Gnu-Bash está en orden

AtomicK
fuente
1
¿Adonde vas con eso?
Jesse_b