Estou escrevendo um script bash que move um diretório existente para um novo nome, cria um novo diretório com o nome antigo e depois muda para o diretório recém-criado. Estranhamente, o novo diretório não está vazio, mas contém tudo do diretório antigo, agora renomeado. Mas a mudança foi bem-sucedida, o diretório renomeado existe e contém o que deve conter. E se eu comparar inodes, ainda estou no diretório renomeado, mas o nome indicado com 'pwd' mostra que deveria estar no novo diretório.
Para deixar as coisas mais claras, estou começando no diretório do qual desejo criar um backup. O script essencialmente faz o seguinte:
cd <away>
mv <olddir> <olddir>~
mkdir <olddir>
cd <olddir>
Estou usando nomes de caminho completos; usar pushd/popd dá o mesmo resultado. O resultado é muito estranho (test9 é um arquivo vazio que criei para ver facilmente se estou no diretório 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$
O inode 20578307 é o diretório renomeado, 20578306 é o novo. Tentei inserir 'sync' em vários locais do meu script, sem sorte. Se, na linha de comando após a execução do script, eu subir manualmente um nível e depois voltar, tudo estará normal novamente e vejo os números de inode corretos.
Alguma ideia do que tentar? Como contornar? Qual é a razão? Ou até mesmo ter uma solução verdadeira? Estou tão interessado em saber por que isso acontece, quanto em uma forma de trabalhar para conseguir o que preciso.
Responder1
Você nunca mudou de diretório até...
Se, na linha de comando após a execução do script, eu subir manualmente um nível e depois voltar, tudo estará normal novamente.
Você não pode alterar o diretório atual de um terminal executando outro script da maneira usual. Isso ocorre porque os scripts são executados em um subshell que não tem efeito no ambiente do shell pai, ou seja, na sua sessão de terminal.
Você precisafonteseu script como:
source script
que também pode ser abreviado como:
. script
para executá-lo dentro do mesmo shell.