2010-01-25 16 views
15

Quiero ejecutar un comando como 'git tag -l' dentro de un directorio/home/usuario/git/app/pero estoy realmente en/Usuario doméstico. ¿Cómo puedo hacer eso en bash sin cambiar mi directorio de trabajo?Cómo ejecuto un comando desde un directorio específico sin cambiar realmente a ese directorio

Así NO:

cd /home/user/git/app && git tag -l 

debido a que en realidad cambia mi directorio de trabajo y tiene que hacer 'cd/home/usuario nuevo.

+0

es cd - tan difícil de escribir, otra cosa a tener en cuenta es ir-herramienta http: // code.google.com/p/go-tool/ –

+1

está dentro de un script. nada que ver con la pereza – primeminister

Respuesta

0

tratan de utilizar

cd - 

después de todo lo que se hace. Este comando se utiliza para volver a su último directorio de trabajo.

4

Si el comando en cuestión siempre va a ser un comando git, solo debe usar las opciones --git-dir y --work-tree para decirle a git qué hacer. (O si está haciendo esto mucho en el transcurso de un script, establezca las variables GIT_DIR y GIT_WORK_TREE en las rutas adecuadas)

Si esta es una pregunta general, creo que Andrzej tiene un comienzo para la mejor sugerencia: usa una subcamada La forma correcta de iniciar un subnivel, sin embargo, es el uso de paréntesis, a no utilizar la sustitución de comandos (a menos que realmente desea capturar la salida):

(cd $dir && run_command) 

La otra solución, según lo sugerido por Félix y ibread, voluntad por supuesto, funciona, pero ten cuidado: si el comando que estás ejecutando es quizás una función de shell, entonces también podría cd y cambiar el efecto del cd - al final. Lo más seguro en el caso general es almacenar primero el directorio actual en una variable.

+0

Es un comando git en su mayoría, por lo que es ambos. Gracias por la pista sobre el GIT_DIR! – primeminister

+0

Así es como todos los comandos git con guiones funcionan internamente (al menos en el git actual): heredan la configuración para GIT_DIR y GIT_WORK_TREE del comando calling git, y luego los comandos git que posteriormente llaman heredarán de ellos. – Cascabel

1

Es posible que desee hacer algo como (cd /home/user/git/app && git tag -l). Esto genera un nuevo shell y ejecuta los comandos en el shell sin cambiar el shell. Puede verificar esto ejecutando lo siguiente:

$ echo $OLDPWD 
/Users/daveshawley 
$ (cd/&& ls) 
... 
$ echo $OLDPWD 
/Users/daveshawley 
+2

Aún sugeriría usar '&&' en lugar de ';', en caso de que esté usando una variable para el directorio, por lo que podría no existir, y el comando abortaría (o, lo que es peor, estropearía las cosas). – Cascabel

5

Aquí hay otra solución: utilizar pushd para cambiar de directorio, a continuación, volver a popd:

pushd /home/user/git/app && git tag -l; popd 
+0

Cuando desee ejecutar un comando en otro lugar sin cambiar el directorio de trabajo, 'pushd' /' popd' es definitivamente el camino a seguir. – bta

+0

¿No le gustaría '&&' en lugar de un punto y coma antes de 'popd'? De lo contrario, podrías terminar en un tercer directorio. –

+0

El único problema con el enfoque 'pushd' /' popd' es que puede perder información como la variable de entorno 'OLDPWD'.Es mejor que no pisotees el entorno del usuario y simplemente ejecutes una subshell. –

Cuestiones relacionadas