Pregunta ¿Por qué el "cd" no funciona en un script de shell?


Intento escribir un pequeño script para cambiar el directorio actual a mi directorio de proyecto:

#!/bin/bash
cd /home/tree/projects/java

Guardé este archivo como proyecto, agregué permiso de ejecución con chmody lo copió en /usr/bin. Cuando lo llamo por: projno hace nada ¿Qué estoy haciendo mal?


600
2017-11-01 02:07


origen


Respuestas:


Los scripts de Shell se ejecutan dentro de una subshell, y cada subshell tiene su propio concepto de lo que es el directorio actual. los cd tiene éxito, pero tan pronto como la subshell se cierra, vuelves a estar en el caparazón interactivo y nada cambia allí.

Una forma de evitar esto es usar un alias en su lugar:

alias proj="cd /home/tree/projects/java"

506
2017-11-01 02:09



¡No estás haciendo nada mal! Ha cambiado el directorio, pero solo dentro de la subshell que ejecuta el script.

Puede ejecutar la secuencia de comandos en su proceso actual con el comando "punto":

. proj

Pero preferiría la sugerencia de Greg de usar un alias en este caso simple.


401
2017-11-01 02:09



los cd en tu script técnicamente trabajó ya que cambió el directorio del shell que ejecutó el script, pero ese fue un proceso separado bifurcado desde el shell interactivo.

Una manera compatible con Posix de resolver este problema es definir un procedimiento de concha en lugar de un shell invocado script de comando.

jhome () {
  cd /home/tree/projects/java
}

Puede escribir esto o ponerlo en uno de los varios archivos de inicio del shell.


193
2017-08-11 04:20



los cd se realiza dentro del shell del script. Cuando el guión finaliza, ese intérprete de comandos sale, y luego queda en el directorio que era. "Fuente" del script, no lo ejecute. En lugar de:

./myscript.sh

hacer

. ./myscript.sh

(Observe el punto y el espacio antes del nombre del guión).


122
2018-02-10 12:07



Para crear un script bash que se codificará en un directorio de selección:

Crea el archivo de script

#! / bin / sh
# file: / scripts / cdjava
#
cd / home / askgelal / projects / java

Luego crea un alias en tu archivo de inicio.

#! / bin / sh
# file /scripts/mastercode.sh
#
alias cdjava = '. / scripts / cdjava '

  • Creé un archivo de inicio donde descargo todos mis alias y funciones personalizadas.
  • Luego obtengo este archivo en mi .bashrc para tenerlo configurado en cada arranque.

Por ejemplo, cree un archivo maestro de alias / funciones: /scripts/mastercode.sh
(Pon el alias en este archivo)

Luego, al final de tu .bashrc archivo:

fuente /scripts/mastercode.sh



Ahora es fácil de copiar a su directorio java, solo escriba cdjava y usted está allí.


90
2018-05-06 03:41



La idea de Jeremy Ruten de usar un enlace simbólico desencadenó un pensamiento que no ha cruzado ninguna otra respuesta. Utilizar:

CDPATH=:$HOME/projects

El colon principal es importante; significa que si hay un directorio 'dir' en el directorio actual, entonces 'cd dir'cambiará a eso, en lugar de irse a otra parte. Con el valor establecido como se muestra, puede hacer:

cd java

y, si no hay un subdirectorio llamado java en el directorio actual, lo llevará directamente a $ HOME / projects / java - sin alias, sin scripts, sin ejecutivos dudosos o comandos de punto.

My $ HOME es / Users / jleffler; mi $ CDPATH es:

:/Users/jleffler:/Users/jleffler/mail:/Users/jleffler/src:/Users/jleffler/src/perl:/Users/jleffler/src/sqltools:/Users/jleffler/lib:/Users/jleffler/doc:/Users/jleffler/work

36
2017-11-01 04:21



Tengo mi código para trabajar mediante el uso de. <your file name>

./<your file name> la dosis no funciona porque no cambia su directorio en el terminal sino que simplemente cambia el directorio específico de ese script.

Aquí está mi programa

#!/bin/bash 
echo "Taking you to eclipse's workspace."
cd /Developer/Java/workspace

Aquí está mi terminal

nova:~ Kael$ 
nova:~ Kael$ . workspace.sh
Taking you to eclipe's workspace.
nova:workspace Kael$ 

25
2017-10-28 19:42