Solo quiero escribir un script que cambie mi directorio .
Puse los siguientes comandos en el archivo /home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
Lo hice chmod +x pathABC
.
En la terminal, mientras /home/alex
estoy en , ejecuto ./pathABC
, pero la salida es justa HelloWorld
y el directorio actual no cambia.
Entonces, ¿qué está mal?
command-line
scripts
gnome-terminal
Mohammad Reza Rezwani
fuente
fuente
Respuestas:
Como otros han explicado, el directorio cambia en el proceso secundario de su script, no en el proceso terminal desde el que se llama el script. Después de que el proceso secundario muere, estás de vuelta en la terminal que queda donde estaba.
Varias alternativas:
1. Enlace simbólico
Ponga un enlace simbólico en su hogar al largo camino al que desea acceder fácilmente
luego acceda al directorio con:
2. Alias
Pon un alias en tu ~ / .bashrc:
(desde aquí )
3. Función
Cree una función que cambie el directorio, la función se ejecuta en el proceso de su terminal y luego puede cambiar su directorio.
(desde aquí )
4. Evite correr como niño
Obtenga su script en lugar de ejecutarlo. El aprovisionamiento (hecho por
.
osource
) hace que el script se ejecute en el mismo shell en lugar de ejecutarse en su propio subshell.(de aquí y de aquí )
5. vars compatibles con cd
Establezca la
cdable_vars
opción en su~/.bashrc
y cree una variable de entorno en el directorio:Entonces puedes usar
cd pathABC
(desde aquí )
fuente
source
! Siempre me pregunté por qué lo hagosource .bashrc
y nobash .bashrc
cd $pathABC
?Cuando ejecuta un script en una terminal, se ejecuta un proceso secundario. En este programa secundario, es decir, su script cambiará a cualquier directorio especificado. Pero en el proceso padre, es decir, donde ejecuta el script, todavía está en la ruta anterior. O simplemente podemos decir:
The scope of cd command is only for child process not parent
fuente
. pathABC
osource pathABC
.Estás cometiendo un error de pensamiento. Mientras el shell actual permanece en el mismo directorio, el script se ha movido al nuevo directorio.
Puede ver eso creando otro script en el nuevo directorio y ejecutándolo desde su script, después de que haya cambiado el directorio:
El segundo script se ejecutará desde el nuevo directorio.
es solo la salida del script.
fuente
pwd
en el nuevo directorio, en lugar de agregar un script completamente nuevo a la situación.Como hello world es solo una declaración de rastreo, intentemos esto:
Cree un archivo de script bash que
cd.sh
contenga:.sh
extensión es una convención anterior de dar una extensión a los nombres de archivo de script bash. Es puramente cosmético y generalmente innecesario. Sin embargo, en este caso es importante diferenciarse delcd
comando central .Marque el archivo ejecutable del script bash usando:
Ahora ejecuta el archivo:
cd
todos sabemos.$(...)
ejecuta el comando dentro del paréntesis y devuelve la salida.cd.sh
estaba en su camino, no necesita especificar dónde está. Prefijos con./
para especificar que el comando está en el directorio actual.echo
resultado delcd.sh
script se envía de vuelta al padre a través de$(...)
. El padre (nuestro indicador de comandos de shell) usa esta salida y la pasa alcd
comando Linux .Como otros han mencionado, un proceso secundario no puede cambiar el directorio de los padres. Esta es una forma en que el niño puede decirle al padre a dónde ir después de que finalice el proceso.
fuente
14.04
versión que leí hace aproximadamente una hora?cd /home/mike/Documents/A/B/C
que no producía ningún resultado. Ahora esecho "/home/mike/Documents/A/B/C"
, lo que produce salida../cd.sh
, ahora escd $(./cd.sh)
pero cumple el objetivo de que el niño cambie el directorio actual del padre. Sí, no es convencional, pero es otra forma de hacerlo que espero que la gente encuentre interesante.