Est-il possible de définir une commande en bash?

25

Par exemple, puis-je définir:

gb = cd /media/Dan/evolution

... pour que chaque fois que j'exécute gben bash, je peux accéder cdà ce répertoire particulier?

J'ai trouvé quelque chose en ligne: la aliascommande. Mais il semble qu'il ne puisse pas faire le travail ci-dessus.

Est-il possible de le faire? Comment?

Zen
la source
10
alias gb='cd /media/Dan/evolution'
Nykakin
4
@Zen, veuillez accepter la réponse si elle résout le problème. Ceci est un geste de remerciement à l'utilisateur qui vous a aidé à résoudre le problème :)
Ramesh
2
Remarque: Il s'agit de bash: Linux est un noyau. Linux est souvent, à tort, utilisé pour désigner l'ensemble du système d'exploitation. Cela peut entraîner de la confusion. Par exemple, la question «puis-je faire telle ou telle chose sous Linux?» Est si vous pouvez le faire sur un ordinateur alors oui. Parce que vous pouvez implémenter n'importe quel système d'exploitation que vous aimez en utilisant un noyau Linux. Nous devons donc savoir lequel, vous utilisez Ubuntu Gnu + Linux + probablement X11 (si sur un bureau, c'est-à-dire pas un serveur sans écran).
ctrl-alt-delor
@richard Bon point, bien que techniquement ce soit une posixplainte, donc pas seulement bash.
1
@richard En effet, c'est le problème. Cela fonctionne car les gens ne parlent pas d'Android et de ces saveurs, plus ou moins. Je ne dis pas que c'est une bonne chose, mais c'est ce que c'est. Ma référence était implicite puisque je commentais votre déclaration Linux. Je me faisais juste comprendre car le sujet était le terme déroutant. (J'ai peut-être mal compris votre dernier commentaire)
keyser

Réponses:

50

tapez simplement:

alias gb='cd /media/Dan/evolution'

Pour rendre ce paramètre permanent (afin qu'il reste après avoir redémarré ou ouvert une autre console), ajoutez cette ligne au fichier ~ / .bashrc (en supposant que vous utilisez le bash comme shell par défaut)

schrobe
la source
Pour le rendre encore plus agréable, vous pouvez créer un fichier d'alias dédié pour vos aliasses, par exemple ~ / .bash_aliases, et l'appeler à partir de votre fichier ~ / .bashrc comme ceci: [-e ~ / .bash_aliases] &&. ~ / .bash_aliases De cette façon, vous ne "polluez" pas le fichier ~ / .bashrc avec d'autres éléments.
GeertVc
39

Alternative à l'aliasing

gb() { cd /media/Dan/evolution; }

Ceci définit la fonction shell gb, qui ne prend aucun argument et exécute cd / media / Dan / evolution. Comme avec d'autres suggestions, cela peut être ajouté à ~ / .bashrc

user1207217
la source
Avec l'inconvénient que la commande alias affiche l'alias défini, afaik définir une telle fonction peut entraîner un "comportement inattendu". Je voterai pour toi par souci d'exhaustivité :)
vfbsilva
7
Pas vraiment. Vous pouvez simplement taper: declare -f gb pour voir ce qu'il fait
Paul Calabro
11
En outre, cette option est plus flexible en ce qu'elle vous permet d'ajouter votre logique personnalisée dans la définition de fonction pour accepter des arguments et faire tout ce dont vous avez besoin. Les alias permettent uniquement de passer des arguments et d'effectuer des actions prédéfinies .
Paul Calabro
5
@PaulCalabro Encore mieux, type gbfonctionnera s'il s'agit d'un alias ou d' une fonction.
Sparhawk
POSIX: { echo 'true() { : ; }' >./script ; . ./script ; command -V true ; command -V /usr/bin/true ; }- true is a shell function\n/usr/bin/true is /usr/bin/true- les \ncaractères étaient littéralement des retours à la ligne dans la sortie.
mikeserv
11

C'est possible et aliasc'est la commande que vous recherchez. Par exemple, alias ll="ls -l"dans bash, vous pourrez taper llau lieu de ls -l. Veuillez noter qu'aucun espace n'est utilisé lors de la définition d'un alias. man aliaspeut également être utile.

Schaiba
la source
-3

Alternativement, il est possible d'écrire un programme C qui appelle la commande souhaitée et de l'enregistrer dans / usr / bin.

#include <stdio.h>
#include <string.h>

int main () {
    char command[50]; //notice you can change this to fit your needs
    int return_val;

    strcpy( command, "echo \"cd /media/Dan/evolution\" | bash -i" );
    return_val = system(command); 

   //this is equivalent to entering the command in a new bash, 
   //which will return and exit

    return return_val;
}

Pour le compiler, allez dans le répertoire où la source a été enregistrée (en bash) et exécutez (vous aurez peut-être besoin de sudo):

 gcc ./gb.c -o /usr/bin/gb

Après de plus amples recherches ici , j'ai réalisé que le simple fait de lancer votre commande system()ne fonctionnera pas pour les commandes intégrées de bash. C'est pourquoi vous devez créer une instance d'un bash interactif et y faire écho vos commandes. C'est juste trop compliqué et probablement inutile, sauf si vous voulez, disons, raccourcir un appel à un script shell ( some_scriptau lieu de sh ~/radgeRayden/Scripts/some_script).

Référence pour la fonction system ()

radgeRayden
la source
2
Avez-vous vraiment essayé cela? Ça ne marche pas.
Dennis
1
Pour la même raison, cela sh -c "cd /media/Dan/evolution"ne fonctionne pas. Astuce: subshell
Digital Trauma
5
cdMis à part les problèmes de sous-shell, quel est l'avantage d'envelopper une commande shell dans le programme c, quand vous pourriez tout aussi facilement (ou plus facilement) mettre cette commande dans un script shell?
Digital Trauma
1
Pas un expert en la matière, mais ne devrait-on pas mettre quelque chose comme ça (espérons-le, quelque chose de plus utile) dans / usr / local / bin?
Joe
2
Même si cela POURRAIT fonctionner, il ne devrait pas aller dans / usr / local / bin car il est spécifique à un seul utilisateur.
Johan