Cuando cambio el directorio de trabajo en un script y lo ejecuto, el directorio de trabajo solo cambia a la ruta especificada mientras está en el script.

Cuando cambio el directorio de trabajo en un script y lo ejecuto, el directorio de trabajo solo cambia a la ruta especificada mientras está en el script.

Cuando cambio el directorio de trabajo en un script y lo ejecuto, el directorio de trabajo solo cambia a la ruta especificada mientras está en el script. Aquí está mi script: (esto fue para asegurarme de que realmente cambiara de directorio)
#!/bin/bash
cd /media/hard/drive/partitionX/
pwd

Cuando lo ejecuto, devuelve la ruta especificada, pero mi directorio de trabajo en la terminal no cambia. ¿Cómo cambio el directorio de trabajo en mi terminal a través de un script?

Respuesta1

Esto es normal. El directorio "actual" o "de trabajo" es un parámetro por proceso, y un proceso sólo puede cambiarsu propiodirectorio de trabajo. Los scripts independientes se ejecutan como un proceso de shell independiente y no pueden afectar al shell principal (de hecho, es posible que el shell principal no siempresercomo el infierno).

Necesitará utilizar funciones internas de su shell, como por ejemplo:

  • funciones de shell:

    mycd() {
        cd /media/hard/drive/partitionX/;
        pwd;
    }
    
  • alias de shell:

    alias mycd='cd /media/hard/drive/partitionX; pwd'
    
  • "obtener" un script en lugar de ejecutarlo:

    . mycd.sh
    

Si tu objetivo principal es crear accesos directos a ciertos directorios, también puedes usar:

  • enlaces simbólicos en una ubicación más conveniente:

    ln -s /media/hard/drive/partitionX ~/partX
    cd ~/partX
    
  • variables ($mydir):

    mydir=/media/hard/drive
    cd $mydir
    
  • la característica $CDPATH:

    CDPATH=".:/media/hard/drive"
    cd partitionX
    

Respuesta2

En realidad, descubrí, después de muchas búsquedas, que si necesita cambiar el directorio y aún mantener el mismo shell, para obtener todas las respuestas en su script actual, puede usar:

(cd your_dir; do_some_command_there)

Por ejemplo, lo que necesitaba usar era:

((cd your_dir; git remote -v | wc -l)

¡Funciona de maravilla!

información relacionada