
Sólo quiero escribir un guión quecambia mi directorio.
Puse los siguientes comandos en el archivo./home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
Hice
chmod +x pathABC
En la Terminal, mientras estaba en /home/alex
, ejecuté ./pathABC
, pero el resultado es solo HelloWorld
y el directorio actual no cambia.
Entonces, ¿qué pasa?
Respuesta1
Como han explicado otros, el directorio se cambia en el proceso secundario de su script, no en el proceso de terminal desde el cual se llama el script. Después de que el proceso secundario muere, regresa a la terminal que se deja donde estaba.
Varias alternativas:
1. Vínculo simbólico
Coloque un enlace simbólico en su hogar al camino largo al que desea acceder fácilmente
$ ln -s /home/alex/Documents/A/B/C ~/pathABC
luego acceda al directorio con:
$ cd ~/pathABC
2. Alias
Pon un alias en tu ~/.bashrc:
alias pathABC="cd /home/alex/Documents/A/B/C"
(deaquí)
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.
(deaquí)
4. Evite correr cuando sea niño
Obtenga su script en lugar de ejecutarlo. El abastecimiento (realizado por .
o source
) hace que el script se ejecute en el mismo shell en lugar de ejecutarse en su propio subshell.
$ . ./pathABC
5. vars compatibles con cd
Configure la cdable_vars
opción en su ~/.bashrc
y cree una variable de entorno en el directorio:
shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"
Entonces puedes usarcd pathABC
(deaquí)
Respuesta2
Cuando ejecuta un script en una Terminal, se ejecuta un proceso secundario. En este programa hijo, es decir, su script cambiará a cualquier directorio especificado. Pero en el proceso principal, es decir, donde ejecuta el script, todavía se encuentra en la ruta anterior. O simplemente podemos decir:
El alcance del comando cd es solo para el proceso hijo, no para el padre.
Respuesta3
Estás cometiendo un error de pensamiento. Mientras que la corrientecaparazónpermanece en el mismo directorio, elguionse ha movido al nuevo directorio.
Podrías ver eso creando otro script en elnuevodirectorio y ejecutarlo desde su script, después de que haya cambiado de directorio:
#!/bin/sh
cd /home/alex/Documents/A/B/C && ./another_script.sh # (if it is executable)
El segundo script se ejecutaría desde el nuevo directorio.
HelloWorld
es solo el resultado del script.
Respuesta4
Usar $SHELL
al final
Un script bash opera en su entorno actual o en el de sus hijos, pero nunca en su entorno padre.
Sin embargo, esta pregunta a menudo se hace porque uno quieredejarse en un símbolo del sistema en un directorio determinado después de la ejecuciónde un script desde otro directorio.
Si este es el caso, simplementeejecutar una $SHELL
instancia secundariaal final del guión:
# !/usr/bin/env bash
cd /home/alex/Documents/A/B/C
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL
Para volver a la instancia de shell principal anterior, utilice Ctrl+ D.