Quiero ejecutar un script para simplemente cambiar el directorio de trabajo actual:
#!/bin/bash
cd web/www/project
Pero, después de ejecutarlo, ¡el pwd actual permanece sin cambios! ¿Cómo puedo hacer eso?
Quiero ejecutar un script para simplemente cambiar el directorio de trabajo actual:
#!/bin/bash
cd web/www/project
Pero, después de ejecutarlo, ¡el pwd actual permanece sin cambios! ¿Cómo puedo hacer eso?
Respuestas:
Es un comportamiento esperado, y ya se discutió varias veces.
El script se ejecuta en un subshell y no puede cambiar el directorio de trabajo del shell principal. Sus efectos se pierden cuando termina.
Para cambiar el directorio de forma permanente, debe obtener el script, como en
. ./script
source ./script
lo mismo?
.
y source
son iguales en bash. 2. no necesitamos usar ./
antes del nombre del archivo si está en el mismo directorio. Está bien ejecutar solo esto:. script
Para tareas pequeñas como esta, en lugar de crear un script, cree un alias como este,
$ alias cdproj='cd /dir/web/www/proj'
Debe agregar esto a su .bashrc
archivo, si desea que se configure para cada shell interactivo.
Ahora puedes ejecutar esto como $ cdproj
.
eval `./script`
o eval $(./script)
ejecutar esos comandos. Este es un enfoque común para los comandos que necesitan actualizar el entorno del shell de invocación.
eval
adoptar el enfoque.
exec bash
al finalUn script bash opera en su entorno actual o en el de sus hijos, pero nunca en su entorno principal.
Sin embargo, esta pregunta a menudo se hace porque uno quiere quedarse en el indicador bash en un determinado directorio después de la ejecución de un script bash desde otro directorio.
Si este es el caso, simplemente ejecute una instancia de bash secundaria al final del script:
#!/usr/bin/env bash
cd desired/directory
exec bash
Esto crea una nueva subshell. Escriba exit
para volver al primer shell donde se inició inicialmente el script.
exec
generalmente se considera el último recurso de un sinvergüenza .. :)
exit
(o Ctrl + D), tendrá que hacerlo de 11 a 21 veces. (2) Otro inconveniente de usar un script ejecutable es que, si configura alguna opción de shell (p. Ej., dotglob
O globstar
) en su sesión de shell interactivo, las perderá porque está comenzando un nuevo shell.
Si bien hay respuestas que realizan la acción exacta que desea, un método más estándar para tal propósito es crear un enlace simbólico:
ln -s ~/web/www/project proj #use full path to dir!
Entonces podría cd
al directorio usando el nombre proj
:
cd proj
Este método es más flexible porque puede acceder a los archivos usando el nombre corto sin cd
:
ls proj/ #note the endslash!
vim proj/file.x
Depende de lo que vaya a hacer, otra solución puede ser crear una función en lugar de un script.
Ejemplo:
Cree una función en un archivo, digamos /home/aidin/my-cd-script
:
function my-cd() {
cd /to/my/path
}
Luego inclúyalo en su archivo bashrc
o zshrc
:
# Somewhere in rc file
source /home/aidin/my-cd-script
Ahora puedes usarlo como un comando:
$ my-cd
¿Por qué no usar "exec" que parece hacer exactamente lo que deseo?
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(o Ctrl + D), tendrá que hacerlo de 11 a 21 veces.
dotglob
o globstar
), las perderás porque estás comenzando un nuevo shell. … (Continúa)
Puede hacerlo usando una función o usando &&. Los siguientes ejemplos instalan Zabbix y crean un archivo con una línea dentro.
Ex:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
o:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
para escapar de un script generado de esta manera, noexit
, son como funciones de shell yexit
saldrán del shell que originó el script.