Di que estoy haciendo esto:
cd subdir
git init
cd ../
¿Hay alguna manera de hacer esto con un solo comando, o tal vez dos, en lugar de tener que entrar y salir de un directorio para ejecutar un comando allí?
(No busco una solución específica de git; eso es solo un ejemplo).
$?
contendrá el código de salida del último comando que se ejecutó en la subshell. Si usa la&&
variante (que normalmente debería), obtendrá el código de salida del primer comando que falló (o 0 si todo salió bien).Estaba buscando una manera de ejecutar el comando git desde una ruta y hacer cambios en el repositorio en una ruta diferente. Así que terminé en esta pregunta aquí.
Pero para mis necesidades específicas, ni la respuesta aceptada ni ninguna de las otras me ayudaron.
Necesitaba ejecutar comandos git usando
sudo -u USER /usr/bin/git
(otro usuario lo ejecuta). Y como sabrán, sudo no me permite ejecutar elcd
comando, por lo que no puedo estar en el directorio del repositorio.Entonces, fui a la página de manual de git . Y entre las opciones, vi el
--git-dir=<path>
:Entonces, si ayuda a alguien, aún puede usar git desde una ruta y hacer cambios en un repositorio "lejos de usted". Solo usa:
o, para ejecutarlo como otro usuario, haga algo como:
También de la página de manual de git-init :
Por lo tanto, si desea iniciar el repositorio en la carpeta .git habitual, deberá especificarlo junto con la
--git-dir
opción. p.ej:Después de inicializar el repositorio
/path/to/repo/.git
, todos los comandos adicionales deben tener la opción--work-tree=<path>
, como se describe en la página de manual de git:Entonces, el comando correcto para ejecutar git como otro usuario e inicializar un nuevo repositorio es:
fuente
sudo -i
osudo su
obtener un shell raíz interactivo.( cd subdir && sudo -u USER /usr/bin/git init )
qué no funcionaría.subdir
?No es exactamente lo que estás preguntando (tienes respuestas reales arriba con la subshell) pero mira
pushd
ypopd
fuente
Tienes pocas opciones. Puede agrupar los comandos con
&&
o;
. Me gusta esto:o
La diferencia entre estos es que en el primer ejemplo, si uno de los comandos falla, no ejecutará el resto de ellos. En el segundo ejemplo, todos los comandos se ejecutarán sin importar qué.
Otra opción sería definir una función y usarla, por ejemplo:
Entonces puedes ejecutar el comando:
Y estará automáticamente
git init
en ese directorio y saldrá de él.También podría hacer una solución más compleja usando una función si tiene un montón de directorios y los quiere
git init
con un solo comando.Luego puede ejecutar esto con:
Y lo hará
git init
ensubdir1
,subdir2
, ysubdir3
.fuente
&&
y;
, pero esperaba algo más elegante. Parece que escribir un guión es mi mejor opción.cdinit
función puede generalizarse para comandos arbitrarios? Intenté usar solo los argumentos, pero eso no funcionó.;
, por lo que la función de tres líneas es equivalente acd $1; git init; cd ..
. (2) Usted debe citar sus variables:"$1"
,"$@"
y"$arg"
. O puede abreviarfor arg in "$@"
afor arg
.En el caso de
git
(al menos en la versión 2.7.0), puede aprovechar la-C
opción que hace que git se comporte como si se iniciara en el directorio dado. Entonces su solución puede verse así:Citando la documentación:
fuente
Puede agrupar los comandos con &&, es decir
Si no desea ninguna dependencia en el código de salida de cada comando, puede usar; en cambio, es decir:
fuente
;
para que no dependan del código de retorno del anterior.cd subdir && git init ; cd ..
realidad puede tener más sentido. Si el usuario desea ejecutar elgit init
comando en elsubdir
, probablemente no quiera ejecutar el comando en el directorio actual; es decir, no quieren ejecutarlo si el (primero)cd
falla. (Aunque es posible que lacd
falla porque estamos ya en elsubdir
, pero eso es un caso límite.) ... (Continuación)cd
copia de seguridad en el directorio inicial incluso si elgit init
comando falla. ( O bien, es posible que quieran permanecer en el subdirectorio y diagnosticar el fallo del comando). (2) No es necesario incluir el/
after..
.Debe saltar a su directorio de destino si el comando no tiene un nombre de archivo o parámetro de nombre de directorio.
Pero puede escribir un script bash que tome el directorio de destino y el comando como parámetros. Para esto, puede echar un vistazo a pushd y popd: http://ss64.com/bash/pushd.html
Escribiría ese pequeño script para ti, pero no tengo un cuadro de Linux aquí :)
fuente
Los programas tienen diferentes formas de manejar argumentos, por lo que algunos tendrán algún equivalente de la opción -folder = name . Más allá de esa excepción, el estándar, incluso en MS DOS, es simplemente
$ program subdir
A veces necesitas
$ program subdir /
El programa abrirá la carpeta, trabajará con ella de la misma manera que trabaja con un archivo y, una vez terminado, devolverá el control a su shell, que apunta a su directorio estándar original. Los programas manejados de esta manera TIENEN el problema de que las salidas de error (como los volcados de núcleo) van a un archivo en el directorio actual de su shell (en lugar de subdireccionar ).
No hay una solución alternativa a menos que el programa tenga interruptores de comando disponibles para especificar un lugar diferente. Algunos programadores obtienen una licencia artística entre "se llamó al programa de directorio " y "se le dijo al programa de directorio que trabajara ".
fuente