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

24

J'ai une fonction qui convertit le temps de l'époque à 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 afin que je puisse obtenir la date correspondante. Je comprends que je dois l' ajouter dans les deux .bash_profile, .profileou .bashrcet source puis:

$ source file

Mais, je ne sais pas dans quel fichier le mettre. Actuellement, je l'ai .profile. Mais pour le faire fonctionner, je dois le faire à source .profilechaque fois.

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

Mec
la source
pour un échantillon d'entrée; 1. sortie de texte epochconverter.com est maintenant 1514917788; 2. de bash lui-même $ date +% s par stackoverflow.com/questions/1092631/…
AnneTheAgile

Réponses:

25

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'une des ~/.bash_profile, ~/.bash_loginou ~/.profile, ou tout autre fichier sourced par l' un de ces . En général ~/.profile, la 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 $SHELLou exécutez source ~/.bashrc.

l0b0
la source
1
Eh bien, j'ai essayé votre façon de créer une fonction personnalisée d'impression de son argument, mais même si j'ajoute cette fonction, .bash_profileje dois également le faire à source ~/.bash_profilechaque fois que j'ouvre le terminal par raccourci Ctrl+Alt+T.
Vicky Dev
@VickyDev Si vous devez à source ~/.bash_profilechaque fois, c'est une indication que votre configuration Bash est en quelque sorte non standard ou cassée (selon la man bashsortie mentionnée). Êtes-vous sûr que vous utilisez réellement Bash? Par exemple, echo $BASHPIDimprime-t-il quelque chose?
l0b0
Devez-vous ajouter #!/bin/shen haut de .profilepour définir une fonction?
Kolob Canyon
13

Après avoir défini la fonction dans votre .profile, ajoutez export -f date1. Cela exportera la fonction pour une utilisation par votre shell de connexion.

DopeGhoti
la source
+1 pour l'exportation, j'ai dû invoquer et alias dans ssh ProxyCommand, et il a continué à crasher sur un alias introuvable même après le .profile source. Fonctionne comme un charme après l'exportation.
Abhishek Anand
7

Les personnalisations des shells interactifs sont effectuées ~/.bashrc. Les choses que vous souhaitez exécuter lorsque vous vous connectez vont ~/.profile(ou ~/.bash_profile, mais elles ne sont souvent pas chargées lors de la connexion graphique).

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

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

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

c'est-à-dire charger ~/.profile, et aussi charger ~/.bashrcsi le shell est interactif.

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

Gilles 'SO- arrête d'être méchant'
la source
1

csh et tcsh ne supportent pas 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 consiste à faire la \!:[x]syntaxe pour obtenir l'entrée de la ligne de commande.

Cela devrait suffire à vous faire trier.

user1610950
la source
0

Vous pouvez rediriger toutes les fonctions en cours de 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
Noam Manos
la source
-1

point 18: Dans ma mémoire ancienne lorsqu'un administrateur, apprendre ksh et bash était kina dans l'autre sens. 1: - Le contenu de / etc / profile est sysWide. / etc / skel contenait le fichier donné aux nouveaux comptes. Depuis Bash maintenant premier commun de toutes les distributions. le suivant serait 2: - ~ / .profile en tant que norme système puis dans le contenu du .profile "s'il existe" .bash_profile mettrait -> 3: - .bash_profile 4: - .bash_login 5: -. bashrc .bash_aliases serait dans mon esprit l'ordre le plus correct, la mise en place de l'environnement Terminal et Shell standard et habituel .bash_login jamais trouvé ou existant (sa coutume par utilisateur). Avec .profile $ PATH étant principal si le.
Je trouve en ajoutant maintenant trop .bash_profile .profile est toujours dominant et ne respecte pas la présence de .bash_profile. Avec les informations d'en-tête, personne ne met à jour, c'est-à-dire: bash startup Samples - cette structure de répertoire n'est plus - ainsi que des exemples et / ou des fichiers sont gzip'd. Donc, la mise à jour de Gnu-Bash est en ordre

AtomicK
la source
1
Qu'est-ce que tu fais?
Jesse_b