cambiar el directorio de trabajo actual con un script

8

He leído esta pregunta y respuesta, pero no se ajusta a mi problema, aunque sea similar.

Estoy escribiendo un script (llamado cpj) que lanzará uno de mis proyectos actuales. Tengo alrededor de 5 de ellos. Cuando escribo

$ cpj blah

Quiero que el directorio de trabajo actual cambie al directorio del proyecto bla (que tengo en $ PROJDIR) y quiero que emacsclient abra el archivo principal para ese proyecto (que tengo en $ MAINFILE).

La pregunta que cité dice que no puede cambiar directamente el entorno del shell que ejecuta el script, pero puede obtener un script y lo hará.

Para probar esto, escribí un script de shell (llamado chcwd) que tiene una línea:

cd $1

Si, desde la línea de comando hago:

$ . chcwd $PROJDIR

mi directorio de trabajo actual cambiará como lo desee. Si, por otro lado, desde mi script cpj, tengo la misma línea:

. chcwd $PROJECT

no cambiará el directorio de trabajo actual del shell. Me doy cuenta de que estoy ejecutando 2 scripts (cpj y luego chcwd), y creando 2 shells, pero no veo forma de hacer lo que quiero. ¿Alguien puede mostrarme cómo lograr mi objetivo?

bev
fuente

Respuestas:

11

No puedes tener tu pastel y comértelo también. Las dos cosas que suceden aquí son ejecutar un script en un nuevo shell e importar líneas de script para ejecutar en el shell actual. Al utilizar el operador de punto (que es un alias para el sourcecomando), en realidad está ejecutando el código en su shell actual . Si su código lo elige cd, cuando lo haga, se lo dejará en el nuevo directorio.

Si, por otro lado, desea ejecutar un programa (o script, no importa), ese programa se lanzará como un subproceso. En el caso de los scripts de shell, se abrirá un nuevo shell y el código se ejecutará dentro de él. Cualquier cdacción tomada cambiará el directorio de trabajo actual para ese shell, efectivo para cualquier comando a seguir. Cuando finalice el trabajo, el shell saldrá, dejándolo nuevamente en su shell original (y sin modificar).

Si es algo que usa mucho y desea que sus efectos se dejen atrás en su shell actual, tal vez podría escribir su "script" como una función de shell y guardarlo en su ~ / .profile u otro archivo rc de shell.

function cpj() {
    # code here
    cd /path/$1
    emacs file_name
}
Caleb
fuente
Caleb, gracias por tu aporte. Me gusta tu juego de palabras. Su primer párrafo repite admirablemente lo que dije en mi pregunta. Su segundo párrafo reafirma lo que se dijo en la pregunta que cité bastante bien. ¡Su tercer párrafo es exactamente y precisamente lo que estaba buscando! Gracias amigo
bev
2

Tengo un guión similar escrito para mi uso personal. Hay un truco muy fácil para lograr cambiar el directorio de trabajo dentro de un script. Primero solo escribe tu guión, en ej .:

#!/bin/bash

case $1 in
     project1) cd /home/me/work/customer1/project1
     ;;
     project2) cd /home/me/work/customer2/project1
     ;;
     project3) cd /home/me/work/customer3/project2
     ;;
     project4) cd /home/me/work/customer4/project5
     ;;
     *) echo "Usage: cdto cd_profile_name"
     ;;
esac

Ahora supongamos que el script se llama 'cdto'. Para que funcione, debe obtenerlo en el shell actual, lo que se puede lograr con 'fuente' o ''. comando (ambos son lo mismo). En ej .:

. cdto project1

Ahora para hacerlo más conveniente:

  1. Copie el script 'cdto' en el directorio 'bin' de su cuenta (por ejemplo, / home / johnsmith / bin; créelo si no existe). Verifique su variable PATH para asegurarse de que el directorio 'bin' esté incluido:

    echo $ RUTA

De lo contrario, edite su archivo .profile y agregue:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
  1. Agregue un alias a su archivo .bashrc o .bash_aliases:

    alias cdto = '. cdto '

Y ya está hecho. Después del próximo inicio de sesión o cuando abra una nueva terminal, puede usar in.ex .:

cdto project1

Disfruta :-)

Sebastian Piech

Sebastian Piech
fuente
0

Un simple truco para hacer esto:

pushd $PROJDIR && bash

Ahora el directorio de trabajo es $ PROJECT.

Artererpi
fuente