Estoy escribiendo un script bash que mueve un directorio existente a un nuevo nombre, crea un nuevo directorio con el nombre anterior y luego cambia al directorio recién creado. Curiosamente, el nuevo directorio no está vacío, sino que contiene todo el contenido del directorio antiguo, ahora renombrado. Pero el movimiento fue exitoso, el directorio renombrado existe y contiene lo que debe contener. Y si comparo inodos, todavía estoy en el directorio renombrado, pero el nombre indicado con 'pwd' muestra que debería estar en el nuevo directorio.
Para dejar las cosas más claras, comienzo en el directorio desde el que quiero crear una copia de seguridad. El script básicamente hace lo siguiente:
cd <away>
mv <olddir> <olddir>~
mkdir <olddir>
cd <olddir>
Estoy usando nombres de ruta completos; usar pushd/popd da el mismo resultado. El resultado es muy extraño (test9 es un archivo vacío que creé para ver fácilmente si estoy en el directorio esperado):
/opt/camera_pkg_sdk$ ls -ia1
20578307 .
20447233 ..
20578305 test9
/opt/camera_pkg_sdk$ ls -ia1 ../camera_pkg_sdk
20578306 .
20447233 ..
/opt/camera_pkg_sdk$
El inodo 20578307 es el directorio renombrado, 20578306 es el nuevo. Intenté insertar 'sincronización' en varias ubicaciones de mi script, sin suerte. Si, en la línea de comando después de ejecutar el script, subo manualmente un nivel y luego regreso, todo vuelve a ser normal y veo los números de inodo correctos.
¿Alguna idea de qué probar? ¿Cómo solucionarlo? ¿Cuál es la razón? ¿O incluso tener una verdadera solución? Me interesa tanto el por qué sucede como la forma de trabajar para lograr lo que necesito.
Respuesta1
Nunca cambiaste de directorio hasta...
Si, en la línea de comando después de ejecutar el script, subo manualmente un nivel y luego regreso, todo vuelve a ser normal.
No puede cambiar el directorio actual de una terminal ejecutando otro script de la forma habitual. Esto se debe a que los scripts se ejecutan en un subshell que no tiene ningún efecto en el entorno del shell principal, es decir, su sesión de terminal.
Necesitasfuentesu guión como:
source script
que también se puede abreviar como:
. script
para ejecutarlo dentro del mismo shell.