Estoy tratando de 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 chmod
y lo copié /usr/bin
. Cuando lo llamo por:,
proj
no hace nada. ¿Qué estoy haciendo mal?
pwd
en la última línea. Así que antes de secuencia de finalización a continuación, se puede comprobar que está funcionando o no ..cd
El comando funciona bien dentro de los scripts, pruébelo usted mismo.cd
ubicado?Respuestas:
Los scripts de shell se ejecutan dentro de un subshell, y cada subshell tiene su propio concepto de cuál es el directorio actual. Lo
cd
logra, pero tan pronto como la subshell sale, estás de vuelta en la shell interactiva y nada ha cambiado allí.Una forma de evitar esto es usar un alias en su lugar:
fuente
. my-script
osource my-script
.¡No estás haciendo nada malo! Ha cambiado el directorio, pero solo dentro de la subshell que ejecuta el script.
Puede ejecutar el script en su proceso actual con el comando "punto":
Pero preferiría la sugerencia de Greg de usar un alias en este caso simple.
fuente
.
también se deletreasource
, elija el que le parezca más memorable.los
cd
en el script de vista técnico trabajaron , ya que cambió el directorio de la cáscara que corría el guión, pero eso fue un proceso separado en forma de horquilla de su consola interactiva.Una forma compatible con Posix para resolver este problema es definir un procedimiento de shell en lugar de un script de comando invocado por shell .
Simplemente puede escribir esto o ponerlo en uno de los diversos archivos de inicio de shell.
fuente
jhome(){ cd /home/tree/projects/$1; }
El
cd
se realiza dentro del shell del script. Cuando finaliza la secuencia de comandos, ese shell sale, y luego queda en el directorio en el que estaba. "Fuente" el script, no lo ejecutes. En vez de:hacer
(Observe el punto y el espacio antes del nombre del script).
fuente
source
myscript.sh
está en un directorio incluido en $ PATH, puede obtenerlo desde cualquier lugar sin especificar la ruta completa.Para hacer un script bash que se cd a un directorio select:
Crea el archivo de script
Luego cree un alias en su archivo de inicio.
Por ejemplo, cree un archivo de alias / funciones maestro: /scripts/mastercode.sh ( coloque
el alias en este archivo).
Luego, al final de su archivo .bashrc :
Ahora es fácil de cd a su directorio de Java, simplemente escriba cdjava y ya está.
fuente
mastercode.sh
no necesita el shabang (#!/bin/sh
), ya que no se ejecuta (y no se puede) ejecutar en una subshell. Pero al mismo tiempo, debe documentar el "sabor" de la shell de este archivo; por ejemplo, ksh o bash (o (t) csh / zsh, etc.), y es casi seguro que en realidad no lo essh
. Usualmente agrego un comentario (pero no el shebang) para comunicar esto; por ejemplo, "este archivo debe tener su origen (de bash), no ejecutarse como un script de shell".source
d (a través dealias
), esas variables se filtrarán en su entorno de shell. Para evitar eso, haga todo el trabajo del script en una función y simplemente llámelo al final del script. Dentro de la función, declare cualquier variablelocal
.Puede usar
.
para ejecutar un script en el entorno actual del shell:o, alternativamente, es un alias más legible pero específico de shell
source
:Esto evita el subshell y permite que cualquier variable o componente (incluido
cd
) afecte al shell actual.fuente
La idea de Jeremy Ruten de usar un enlace simbólico desencadenó un pensamiento que no ha cruzado ninguna otra respuesta. Utilizar:
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 saltar a otro lado. Con el valor establecido como se muestra, puede hacer:y, si no hay un subdirectorio llamado java en el directorio actual, lo llevará directamente a $ HOME / projects / java: sin alias, sin scripts, sin dudosos ejecutivos o comandos de puntos.
Mi $ HOME es / Usuarios / jleffler; mi $ CDPATH es:
fuente
Usar
exec bash
al finalSin embargo, esta pregunta a menudo se hace porque uno quiere quedarse en un (nuevo) indicador de bash en un determinado directorio después de la ejecución de un script de bash desde otro directorio.
Si este es el caso, simplemente ejecute una instancia de bash secundaria al final del script:
fuente
exit
, volverá al shell donde ejecutó este script.Obtuve mi código para trabajar usando
. <your file name>
./<your file name>
la dosis no funciona porque no cambia su directorio en la terminal, solo cambia el directorio específico de ese script.Aqui esta mi programa
Aqui esta mi terminal
fuente
. something
y./something
?? Esta respuesta funcionó para mí y no entiendo por qué.. something
le permite ejecutar el script desde cualquier ubicación,./something
requiere que esté en el directorio en el que está almacenado el archivo.#!. /bin/bash
?simplemente ejecuta:
fuente
Cuando activa un script de shell, ejecuta una nueva instancia de ese shell (
/bin/bash
). Por lo tanto, su script solo enciende un shell, cambia el directorio y sale. Dicho de otra manera,cd
(y otros comandos similares) dentro de un script de shell no afectan ni tienen acceso al shell desde el que se iniciaron.fuente
En mi caso particular, necesitaba demasiadas veces cambiar para el mismo directorio. Entonces, en mi .bashrc (uso ubuntu) agregué el
1 -
2-
3 -
Directamente lo hará: cd / home / tree / projects / java
¡Espero que ayude!
fuente
Puedes hacer lo siguiente:
EDITAR: Esto también podría estar 'punteado', para evitar la creación de proyectiles posteriores.
Ejemplo:
fuente
exit
(o ctrl + d) varias veces para salir del shell, por ejemplo ... Un alias es mucho más limpio (incluso si el comando del shell genera un directorio, y es cd's a la salida - alias something = "cdgetnewdirectory.sh
")Solo cambia el directorio del script en sí, mientras que su directorio actual permanece igual.
Es posible que desee utilizar un enlace simbólico en su lugar. Le permite hacer un "acceso directo" a un archivo o directorio, por lo que solo tendrá que escribir algo como
cd my-project
.fuente
Puede combinar el alias y los enfoques de punto de Adam y Greg para hacer algo que pueda ser más dinámico:
Ahora, al ejecutar el alias del proyecto, se ejecutará el script del proyecto en el shell actual en lugar del subshell.
fuente
Puedes combinar un alias y un script,
siempre que la secuencia de comandos haga eco de la ruta de destino. Tenga en cuenta que esos son backticks que rodean el nombre del script.
Por ejemplo, su script podría ser
La ventaja de esta técnica es que el script puede tomar cualquier número de parámetros de línea de comando y emitir diferentes destinos calculados por una lógica posiblemente compleja.
fuente
proj() { cd "/home/user/projects/java/$1"; }
=>proj "foo"
(o,proj "foo bar"
<= en caso de que tenga espacios) ... o incluso (por ejemplo):proj() { cd "/home/user/projects/java/$1"; shift; for d; do cd "$d"; done; }
=>proj a b c
=> hace uncd
into/home/user/projects/java/a/b/c
para navegar directorios rápidamente, hay $ CDPATH, cdargs y formas de generar alias automáticamente
http://jackndempsey.blogspot.com/2008/07/cdargs.html
http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5827311.html
fuente
En su archivo ~ / .bash_profile. agrega la siguiente función
Reinicie la terminal y puede escribir
y será trasladado a la carpeta de destino.
fuente
Puede usar el operador &&:
cd myDirectory && ls
fuente
&&
si desea que el segundo sea condicional al primero, o simplemente con;
o una nueva línea entre ellos) pero poner esto en un script lo llevará de regreso a "¿por qué no utiliza el shell principal? el nuevo directorio cuando elcd
fue realmente exitoso? "Si bien la fuente del script que desea ejecutar es una solución, debe tener en cuenta que este script puede modificar directamente el entorno de su shell actual. Además, ya no es posible pasar argumentos.
Otra forma de hacerlo es implementar su script como una función en bash.
Autojump utiliza esta técnica: http://github.com/joelthelion/autojump/wiki para proporcionarle marcadores de directorio de shell de aprendizaje.
fuente
Puede crear una función como la siguiente en su
.bash_profile
y funcionará sin problemas.La siguiente función toma un parámetro opcional que es un proyecto. Por ejemplo, solo puedes ejecutar
o
Aquí está la definición de la función.
No olvides buscar tu fuente
.bash_profile
fuente
Esto debería hacer lo que quieras. Cambie al directorio de interés (desde dentro del script) y luego genere un nuevo shell bash.
Si ejecuta esto, lo llevará al directorio de interés y, cuando salga, lo llevará de regreso al lugar original.
Esto incluso lo llevará a volver a su directorio original cuando salga ( CTRL+ d)
fuente
MUCHO tiempo después, pero hice lo siguiente:
crear un archivo llamado caso
pegue lo siguiente en el archivo:
guárdelo y luego:
También creé un alias en mi
.bashrc
:ahora cuando escribo:
esencialmente estoy escribiendo:
Puede escribir cualquier carpeta después de 'case':
que es como escribir:
respectivamente
En mi caso, el camino es mucho más largo: estos muchachos lo resumieron con la información ~ anterior.
fuente
cd
en el alias es superfluo y poco elegante; el alias debería simplemente ". ~ / case` en su lugar. Tambiéncase
es una palabra clave reservada, por lo que es una elección bastante pobre para un nombre.No necesita script, solo configure la opción correcta y cree una variable de entorno.
en su
~/.bashrc
permite alcd
contenido de variables de entorno.Cree una variable de entorno de este tipo:
y puedes usar:
Otras alternativas .
fuente
Si está utilizando fish como su caparazón, la mejor solución es crear una función. Como ejemplo, dada la pregunta original, puede copiar las 4 líneas a continuación y pegarlas en su línea de comando de pescado:
Esto creará la función y la guardará para su uso posterior. Si su proyecto cambia, simplemente repita el proceso utilizando la nueva ruta.
Si lo prefiere, puede agregar manualmente el archivo de función haciendo lo siguiente:
e ingrese el texto:
y finalmente presione ctrl + x para salir e y seguido de regresar para guardar sus cambios
( NOTA: el primer método de usar funcsave crea el archivo proj.fish para usted ).
fuente
Tengo un script bash simple llamado p para administrar el cambio de directorio en
github.com/godzilla/bash-stuff,
simplemente coloque el script en su directorio bin local (/ usr / local / bin)
y coloque
en tu .bashrc
fuente
Tenga en cuenta la discusión ¿Cómo configuro el directorio de trabajo del proceso principal?
Contiene algunas respuestas piratas, por ejemplo, https://stackoverflow.com/a/2375174/755804 (cambiar el directorio de proceso principal a través de gdb, no haga esto) y https://stackoverflow.com/a/51985735/755804 ( el comando
tailcd
que inyecta cd dirname a la secuencia de entrada del proceso padre; bueno, idealmente debería ser parte de bash en lugar de un hack)fuente
Es una vieja pregunta, pero estoy realmente sorprendido de no ver este truco aquí.
En lugar de usar cd puedes usar
No es necesario crear subcapas o usar alias.
Tenga en cuenta que es su responsabilidad asegurarse de que exista / path / you / want.
fuente
Como se explica en las otras respuestas, ha cambiado el directorio, pero solo dentro del subconjunto que ejecuta el script . Esto no afecta el shell padre.
Una solución es usar funciones bash en lugar de un script bash (
sh
); colocando su código de script bash en una función. Eso hace que la función esté disponible como un comando y luego, esto se ejecutará sin un proceso secundario y, por lo tanto, cualquiercd
comando afectará al shell de la persona que llama.Funciones bash:
Una característica del perfil bash es almacenar funciones personalizadas que pueden ejecutarse en el terminal o en scripts bash de la misma manera que ejecuta aplicaciones / comandos, esto también podría usarse como un acceso directo para comandos largos.
Para hacer que su sistema sea eficiente en gran medida, deberá copiar su función al final de varios archivos
Puedes
sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profile
editar / crear esos archivos rápidamenteCómo :
Copie su código de script bash dentro de una nueva función al final del archivo de perfil de su bash y reinicie su terminal, luego puede ejecutar
cdd
o cualquiera que sea la función que escribió.Ejemplo de guion
Hacer acceso directo a
cd ..
concdd
atajo de ls
atajo de ls
fuente
Puede ejecutar algunas líneas en la misma subshell si termina las líneas con una barra diagonal inversa.
fuente