2010-01-25 16 views
23

Sé cómo configurar alias en bash, pero ¿hay alguna manera de configurar un alias para una secuencia de comandos?¿Cómo puedo definir un alias de bash como una secuencia de comandos múltiples?

Digamos que quiero que un comando cambie a un directorio particular, luego ejecuto otro comando.

Además, ¿hay alguna manera de configurar un comando que ejecute "sudo mycommand", luego ingrese la contraseña? En los días de MS-DOS estaría buscando un archivo .bat pero no estoy seguro del equivalente de Linux (o en este caso Mac OSX).

Respuesta

15

Menciona los archivos BAT así que quizás lo que desea es escribir un script de shell.Si es así, basta con introducir los comandos que desee línea por línea en un archivo de este modo:

command1 
command2 

y pedir bash para ejecutar el archivo:

bash myscript.sh 

Si usted quiere ser capaz de invocar el guión directamente sin necesidad de escribir "golpe" a continuación, agregue la línea siguiente como la primera línea del archivo:

#! /bin/bash 
command1 
command2 

a continuación, marque el archivo como ejecutable:

chmod 755 myscript.sh 

Ahora se puede ejecutar como cualquier otro ejecutable:

./myscript.sh 

Nota que UNIX no le importa acerca de las extensiones de archivo. Simplemente puede nombrar el archivo "myscript" sin la extensión ".sh" si lo desea. Es esa primera línea especial que es importante. Por ejemplo, si desea escribir la secuencia de comandos en el lenguaje de programación Perl en lugar de fiesta de la primera línea sería:

#! /usr/bin/perl 

Esa primera línea le dice a su shell lo interprete a invocar para ejecutar el script.

Además, si ahora copiar la secuencia de comandos en uno de los directorios que aparecen en el PATH variable de entorno $ continuación, se le puede llamar desde cualquier lugar simplemente escribiendo su nombre de archivo:

myscript.sh 
obras

Incluso para rellenar la ficha . Por eso generalmente incluyo un directorio ~/bin en mi $ PATH para que pueda instalar fácilmente scripts personales. Y lo mejor de todo, una vez que tenga un montón de scripts personales que está acostumbrado a tener, puede fácilmente transferirlos a cualquier máquina Unix nueva copiando su directorio personal ~/bin.

+2

También puede utilizar una función de shell' myfunc() {command1 && command2} 'si no desea ensuciar el lugar con archivos. –

+2

Pero "ensuciar el lugar con archivos" es menos desordenado en comparación con ensuciar el archivo .bashrc con funciones. Piense en modular :-) – slebetman

+0

¿En qué idioma están escritos los guiones de shell? – stormist

61

para encadenar una secuencia de comandos, intente esto:

alias x='command1;command2;command3;' 

O usted puede hacer esto:

alias x='command1 && command2 && command3' 

El & & hace sólo ejecutar comandos siguientes, si los rendimientos anteriores exitosa.

También para ingresar contraseñas de forma interactiva, o interactuar con otros programas como ese, revise expect. (http://expect.nist.gov/)

+0

Ha pasado un tiempo desde que hice esto, pero creo que la primera sugerencia dará como resultado que los 3 comandos se ejecuten en paralelo (o tanto como sea posible), y el segundo tendrá los 3 comandos eximidos en serie. De cualquier manera, no estoy seguro de que hagan lo mismo. – FrustratedWithFormsDesigner

+0

Acabo de probarlo con alias x = 'date; sleep 1; date' Y la salida es lo que espero (dos fechas, 1 segundo de diferencia), con el retraso de reposo entre cada salida de fecha. –

+6

@Frustrated: No. Ambos ejecutados en serie. Solo al primero no le importa si falla un comando anterior. Para ejecutar en paralelo sería: 'command1 & command2 & command3' – slebetman

6

Para el alias puede utilizar esto:

alias sequence='command1 -args; command2 -args;' 

o si el segundo comando debe ser ejecutado sólo si la primera tiene éxito uso:

alias sequence='command1 -args && command2 -args' 
3

Apropos varios comandos en una alias único, puede usar uno de los operadores lógicos para combinarlos. Aquí hay uno para cambiar a un directorio y hacer un ls en él

 alias x="cd /tmp && ls -al" 

Otra opción es usar una función de shell. Estos son los comandos sh/zsh/bash. No sé lo suficiente de otras conchas para estar seguro de si funcionan.

En cuanto a lo sudo, si quieres eso (aunque no creo que sea una buena idea), el camino correcto es modificar el archivo /etc/sudoers para obtener lo que deseas.

8

es probable que sea más fácil de definir funciones para este tipo de cosas que los alias, mantiene las cosas más fácil de leer si quieres hacer algo más que un comando o dos:

En su .bashrc

perform_my_command() { 
    pushd /some_dir 
    my_command "[email protected]" 
    popd 
} 

Entonces en la línea de comandos puede simplemente hacer:

perform_my_command my_parameter my_other_parameter "my quoted parameter" 

usted puede hacer lo que quiera en una función, llamar a otras funciones, etc.

Es posible que desee echar un vistazo a la Advanced Bash Scripting Guide para un conocimiento profundo.

6

Su mejor opción es probablemente una función de shell en lugar de un alias si la lógica se vuelve más compleja o si necesita agregar parámetros (aunque bash admite parámetros de alias).

Esta función se puede definir en su .profile o .bashrc. La subshell es para evitar cambiar su directorio de trabajo.

function myfunc { 
    (cd /tmp; command) 
} 

luego de su símbolo del sistema

$ myfunc 

Para su segunda pregunta sólo puede añadir su comando a/etc/sudoers (si está completamente seguro de lo que está haciendo)

myuser   ALL = NOPASSWD: \ 
        /bin/mycommand 
1

también puede escribir una función de shell; ejemplo de "CD" y combinado "LS" here

2

Puede incrustar la declaración de la función seguido de la función en el propio alias, así:

alias my_alias='f() { do_stuff_with "[email protected]" (arguments)" ...; }; f' 

La ventaja de este enfoque sobre acaba de declarar la función por sí solo es que puede tener la tranquilidad de que su función no se verá anulada por otro script que esté obteniendo (o utilizando .), que podría usar su propio asistente con el mismo nombre.

por ejemplo, Suponga que tiene una secuencia de comandos init-my-workspace.sh que está llamando como . init-my-workspace.shsource init-my-workspace.sh o cuyo propósito es establecer o exportar un montón de variables de entorno (por ejemplo, JAVA_HOME, PYTHON_PATH etc.). Si por casualidad tiene una función my_alias dentro, entonces no tiene suerte ya que la última declaración de función con la misma instancia de shell gana.

Por el contrario, los alias tienen un espacio de nombres separado e incluso en caso de conflicto de nombres, se buscan primero. Por lo tanto, para la personalización relevante para el uso interactivo, solo debería usar alias.

Finalmente, tenga en cuenta que la práctica de poner todos los alias en el mismo lugar (por ejemplo, ~/.bash_aliases) le permite detectar fácilmente cualquier conflicto de nombres.

Cuestiones relacionadas