È possibile definire un comando in bash?


25

Ad esempio, posso impostare:

gb = cd /media/Dan/evolution

... in modo che ogni volta che eseguo gbin bash, posso cdin quella particolare directory?

Ho trovato qualcosa online: il aliascomando. Ma sembra che non possa fare il lavoro sopra.

È possibile farlo? Come?


10
alias gb='cd /media/Dan/evolution'
Nykakin,

4
@Zen, per favore accetta la risposta se risolve il problema. Questo è un gesto per dire grazie all'utente che ti ha aiutato a risolvere il problema :)
Ramesh,

2
Nota: si tratta di bash: Linux è un kernel. Linux viene spesso, erroneamente, usato per riferirsi all'intero sistema operativo. Ciò può causare confusione. Ad esempio la domanda "posso fare una cosa del genere su Linux?" È se puoi farlo su un computer, quindi sì. Perché potresti implementare qualsiasi sistema operativo che ti piace usando un kernel Linux. Quindi abbiamo bisogno di sapere quale, stai usando Ubuntu Gnu + Linux + probabilmente X11 (se su un desktop cioè non un server senza display).
ctrl-alt-delor,

@richard Un buon punto, anche se tecnicamente si tratta di posixlamentele, quindi non solo bash.

1
@richard In effetti, questo è il problema. Funziona dal momento che le persone non significano Android e tali sapori, più o meno. Non sto dicendo che è una buona cosa, ma è quello che è. Il mio rinvio era implicito poiché stavo commentando la tua dichiarazione di Linux. Mi stavo solo chiarendo poiché l'argomento era il termine confuso. (Potrei aver frainteso il tuo ultimo commento)
keyer

Risposte:


50

basta digitare:

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

Per rendere permanente questa impostazione (in modo che si attacchi dopo il riavvio o l'apertura di un'altra console) aggiungi questa linea al file ~ / .bashrc (supponendo che tu usi bash come shell predefinita)


Per renderlo ancora più bello, potresti creare un file alias dedicato per i tuoi alias, dire ~ / .bash_aliases e chiamarlo dal tuo file ~ / .bashrc in questo modo: [-e ~ / .bash_aliases] &&. ~ / .bash_aliases In questo modo, non "inquini" il file ~ / .bashrc con altre cose.
GeertVc,

39

Alternativa all'aliasing

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

Questo definisce la funzione di shell gb, che non accetta argomenti ed esegue cd / media / Dan / evolution. Come per altri suggerimenti, questo può essere aggiunto a ~ / .bashrc


Con lo svantaggio che il comando alias mostra l'alias definito, la definizione di tale funzione può comportare un "comportamento imprevisto". Ti voterò per completezza :)
vfbsilva,

7
Non proprio. Puoi semplicemente digitare: dichiarare -f gb per vedere cosa fa
Paul Calabro,

11
Inoltre, questa opzione è più flessibile in quanto consente di aggiungere la logica personalizzata all'interno della definizione della funzione per accettare argomenti e fare tutto il necessario. Gli alias consentono solo il passaggio di argomenti e l'esecuzione di azioni predefinite .
Paul Calabro,

5
@PaulCalabro Ancora meglio, type gbfunzionerà se è un alias o una funzione.
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- i \ncaratteri erano letteralmente newline nell'output.
Mikeserv,

11

È possibile ed aliasè il comando che stai cercando. Ad esempio alias ll="ls -l"in bash ti permetterà di digitare llinvece di ls -l. Si noti che non ci sono spazi utilizzati quando si imposta un alias. man aliaspuò anche essere utile.


-3

In alternativa, è possibile scrivere un programma C che chiama il comando desiderato e salvarlo in / 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;
}

Per compilarlo, vai alla directory in cui è stato salvato il sorgente (in bash) ed esegui (potresti aver bisogno di sudo):

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

Dopo ulteriori ricerche qui , mi sono reso conto che semplicemente lanciare il tuo comando system()non funzionerà per i comandi integrati di bash. Ecco perché devi creare un'istanza di un bash interattivo ed eseguire l'eco dei tuoi comandi su di esso. È solo eccessivamente complicato e probabilmente inutile, a meno che tu non voglia, diciamo, abbreviare una chiamata a uno script di shell ( some_scriptinvece di sh ~/radgeRayden/Scripts/some_script).

Riferimento per la funzione system ()


2
Hai davvero provato questo? Non funziona
Dennis,

1
Per lo stesso motivo che sh -c "cd /media/Dan/evolution"non funziona. Suggerimento: subshell
Digital Trauma,

5
cd/ Problemi di subshell a parte, qual è il vantaggio nel racchiudere un comando shell nel programma c, quando si potrebbe mettere altrettanto facilmente (o più facilmente) quel comando in uno script shell?
Trauma digitale,

1
Non un esperto in questo, ma qualcosa di simile (si spera, qualcosa di più utile) non dovrebbe essere messo in / usr / local / bin?
Joe,

2
Anche se questo POTREBBE funzionare, non dovrebbe andare in / usr / local / bin in quanto è specifico per un utente.
Johan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.