web-dev-qa-db-fra.com

Comment ajouter une fonction à .bash_profile / .profile / bashrc dans le shell?

J'ai une fonction qui convertit le temps Epoch à ce jour. Voici la définition

date1(){
  date -d @$1
}

J'aimerais pouvoir écrire:

$ date1 xxxyyy

Où xxxyyy est le paramètre que je passe dans ma fonction pour que je puisse obtenir la date correspondante. Je comprends que je dois l'ajouter dans l'un ou l'autre .bash_profile, .profile, ou .bashrc puis source:

$ source file

Mais, je ne sais pas dans quel fichier le mettre. Actuellement, je l'ai dans .profile. Mais pour l'exécuter, je dois faire source .profile à chaque fois.

Idéalement, il devrait le rendre disponible, lorsque l'ordinateur démarre comme la variable d'environnement.

24
Dude

De man bash:

Lorsque bash est invoqué en tant que shell de connexion interactif ou en tant que shell non interactif avec l'option --login, il lit et exécute d'abord les commandes du fichier/etc/profile, si ce fichier existe. Après avoir lu ce fichier, il recherche ~/.bash_profile, ~/.bash_login et ~/.profile, dans cet ordre, et lit et exécute les commandes à partir du premier qui existe et est lisible.

En d'autres termes, vous pouvez le mettre dans l'un des ~/.bash_profile, ~/.bash_login ou ~/.profile, ou tout fichier sourced par l'un ou l'autre. Généralement ~/.profile sera source ~/.bashrc, qui est le "fichier d'initialisation personnel, exécuté pour les shells de connexion".

Pour l'activer, démarrez un nouveau shell, exécutez exec $Shell ou exécutez source ~/.bashrc.

25
l0b0

Après avoir défini la fonction dans votre .profile, ajouter export -f date1. Cela exportera la fonction à utiliser par votre shell de connexion.

13
DopeGhoti

Les personnalisations pour les shells interactifs vont dans ~/.bashrc. Les choses que vous souhaitez exécuter lorsque vous vous connectez vont dans ~/.profile (ou ~/.bash_profile, mais il n'est souvent pas chargé lors de la connexion graphique).

Mettez cette définition de fonction dans ~/.bashrc.

Puisque bash ne se charge pas .bashrc lorsqu'il s'agit d'un shell de connexion, forcez-le à le faire: écrivez un ~/.bash_profile contenant

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

c'est-à-dire charger ~/.profile, et également charger ~/.bashrc si le shell est interactif.

Voir Alternative à .bashrc et les articles qui y sont liés.

csh et tcsh ne prennent pas en charge les fonctions comme bash mais vous pouvez le faire.

Par exemple, voici une fonction simple pour imprimer du texte

alias print_hello_world 'eval echo "hello world"'

passer des arguments au script

repeate_after_me 'eval echo "$1"'

faire du code sur plusieurs lignes comme une instruction if est un peu compliqué mais c'est parti.

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

vous devrez toujours évaluer mais la partie la plus complexe est de faire le \!:[x] syntaxe pour obtenir l'entrée de la ligne de commande.

Cela devrait suffire à vous faire trier.

1
user1610950

Vous pouvez rediriger toutes les fonctions actuelles vers bashrc avec typeset.

Par exemple, voici comment j'ajoute une fonction d'une commande openstack avec un paramètre facultatif, dans bashrc:

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

Maintenant, il est enregistré pour les sessions futures et peut être utilisé comme:

$ urc 

ou

$ urc --debug
0
Noam Manos