¿Es posible definir un comando en bash?

25

Por ejemplo, ¿puedo configurar:

gb = cd /media/Dan/evolution

... de modo que cada vez que ejecuto gben bash, ¿puedo cdese directorio en particular?

Encontré algo en línea: el aliascomando. Pero parece que no puede hacer el trabajo anterior.

¿Es posible hacer lo? ¿Cómo?

zen
fuente
10
alias gb='cd /media/Dan/evolution'
Nykakin
44
@ Zen, acepte la respuesta si resuelve el problema. Este es un gesto de agradecimiento al usuario que lo ayudó a resolver el problema :)
Ramesh
2
Nota: Esto se trata de bash: Linux es un núcleo. Linux a menudo, incorrectamente, se usa para referirse a todo el sistema operativo. Esto puede provocar confusión. Por ejemplo, la pregunta "¿puedo hacer tal o cual cosa en Linux?" Es si puedes hacerlo en alguna computadora, entonces sí. Porque podría implementar cualquier sistema operativo que desee utilizando un kernel de Linux. Entonces, necesitamos saber cuál está usando Ubuntu Gnu + Linux + probablemente X11 (si está en un escritorio, es decir, no en un servidor sin pantalla).
ctrl-alt-delor
@richard Buen punto, aunque técnicamente esto es una posixqueja, así que no solo bash.
1
@richard De hecho, ese es el problema. Funciona ya que las personas no se refieren a Android y esos sabores, más o menos. No digo que sea algo bueno, pero es lo que es. Mi referencia fue implícita ya que estaba comentando su declaración de Linux. Solo me estaba aclarando, ya que el tema era un término confuso. (Podría haber entendido mal su último comentario)
keyer

Respuestas:

50

Sólo tipo:

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

Para que esta configuración sea permanente (para que se mantenga después de reiniciar o abrir otra consola) agregue esta línea al archivo ~ / .bashrc (suponiendo que use bash como su shell predeterminado)

Schrobe
fuente
Para hacerlo aún más agradable, puede crear un archivo de alias dedicado para sus alias, decir ~ / .bash_aliases y llamarlo desde su archivo ~ / .bashrc de esta manera: [-e ~ / .bash_aliases] &&. ~ / .bash_aliases De esta manera, no "contaminas" el archivo ~ / .bashrc con otras cosas.
GeertVc
39

Alternativa al alias

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

Esto define la función de shell gb, que no toma argumentos, y realiza cd / media / Dan / evolution. Al igual que con otras sugerencias, esto se puede agregar a ~ / .bashrc

usuario1207217
fuente
Con el inconveniente de que el comando alias muestra el alias definido, afaik que define dicha función puede provocar un "comportamiento inesperado". Voy a votar por ti en aras de la plenitud :)
vfbsilva
77
Realmente no. Simplemente puede escribir: declare -f gb para ver qué hace
Paul Calabro
11
Además, esta opción es más flexible ya que le permite agregar su lógica personalizada dentro de la definición de la función para aceptar argumentos y hacer lo que necesite. Los alias solo permiten pasar argumentos y realizar acciones predefinidas .
Paul Calabro
55
@PaulCalabro Aún mejor, type gbfuncionará si es un alias o una función.
Sparhawk
POSIXLY: { 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- los \ncaracteres eran líneas nuevas literalmente en la salida.
mikeserv
11

Es posible y alias es el comando que estás buscando. Por ejemplo, alias ll="ls -l"en bash te permitirá escribir en lllugar de ls -l. Tenga en cuenta que no se utilizan espacios al configurar un alias. man aliasPuede ser útil también.

schaiba
fuente
-3

Alternativamente, es posible escribir un programa en C que llame al comando deseado y guardarlo en / 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;
}

Para compilarlo, vaya al directorio donde se guardó la fuente (en bash) y ejecute (es posible que necesite sudo):

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

Después de una investigación más exhaustiva aquí , me di cuenta simplemente lanzando su comandosystem() no funcionará para los comandos integrados de bash. Es por eso que necesita crear una instancia de un bash interactivo y hacer eco de sus comandos. Es demasiado complicado y probablemente inútil, a menos que desee, digamos, acortar una llamada a un script de shell (en some_scriptlugar de sh ~/radgeRayden/Scripts/some_script).

Referencia para la función system ()

radgeRayden
fuente
2
¿Realmente intentaste esto? No funciona
Dennis
1
Por la misma razón que sh -c "cd /media/Dan/evolution"no funciona. Sugerencia: subshell
Trauma digital
55
cdDejando a un lado los problemas de subshell, ¿cuál es la ventaja de envolver un comando de shell en el programa c, cuando podría fácilmente (o más fácilmente) poner ese comando en un script de shell?
Trauma digital
1
No soy un experto en esto, pero ¿no debería ponerse algo como esto (con suerte, algo más útil) en / usr / local / bin?
Joe
2
Incluso si esto PODRÍA funcionar, no debería ir a / usr / local / bin ya que es específico para un usuario.
Johan