Shellscript criando diretórios no diretório errado ao executar a partir do crontab

0

Eu escrevi o seguinte código que irá criar diretórios com o formato de nome "nowt_hour_minute_second". Nesse diretório, outro arquivo de texto será criado com o horário de criação do diretório. Agora eu configurei o caminho de criação do diretório como adhikarisubir@ubuntu:~/test/basic_unix . quando estou invocando manualmente o script, os diretórios estão sendo criados no diretório mencionado anteriormente, mas quando estou executando a partir do crontab, ele é criado em adhikarisubir@ubuntu:~ . A seguir, meu script:

 #THIS CODE WILL CREATE A DIRECTORY WITH TIME OF CREATION AS PART OF DIRECTORY NAME
 echo "The time is $(date +%H_%M_%S)"
 now=$(date +%H_%M_%S)
 echo $now
 echo $(pwd) 
 createdep=nowt_$now
 echo "$createdep"
 mkdir "$createdep"
 cd nowt_$now
 echo "Current directory is $(pwd)"
 echo "This is a text file which will contain the createtime" > Newtxt.txt
 sed -i "s/createtime/$(date '+%H:%M:%S')/g" Newtxt.txt

Meu comando crontab é:

*/2 * * * * sh test/basic_unix/createfiles.sh
    
por Mistu4u 03.12.2014 / 21:41

1 resposta

1

Quando você estiver no diretório ~/test/basic_unix e invocar seu script, o comando mkdir "$createdep" criará essa pasta em ~/test/basic_unix porque esse é o diretório atual, é de onde você executou o script. No entanto, quando você executa esse script a partir do cron, o diretório com o qual você começa é o seu diretório inicial, ~ , portanto, o comando mkdir cria a pasta lá.

Sua confusão pode ser porque você acha que, como seu script está em ~/test/basic_unix/createfiles.sh , as pastas sempre serão criadas lá, mas isso é incorreto. Não é sobre onde o script está localizado, é sobre onde você executa o script. Para dar um exemplo, crie um diretório ~/testing2 , depois cd ~/testing2 e, em seguida, chame seu script usando sh ~/test/basic_unix_createfiles.sh . Você verá que suas pastas estão sendo criadas com ~/testing2 , não ~/test/basic_unix . Por quê? Porque é de onde você executou o script e desde que seu comando mkdir está usando um caminho relativo, ou seja, como seu comando mkdir é assim: mkdir foldername , ele é criado no diretório de trabalho.

Para corrigir seu problema, a maneira mais fácil é cd para onde você deseja criar as pastas no início, para que seu script seja assim:

#THIS CODE WILL CREATE A DIRECTORY WITH TIME OF CREATION AS PART OF DIRECTORY NAME
 cd /home/adhikarisubir/test/basic_unix #this is the new line added, the rest is the same
 echo "The time is $(date +%H_%M_%S)"
 now=$(date +%H_%M_%S)
 echo $now
 echo $(pwd) 
 createdep=nowt_$now
 echo "$createdep"
 mkdir "$createdep"
 cd nowt_$now
 echo "Current directory is $(pwd)"
 echo "This is a text file which will contain the createtime" > Newtxt.txt
 sed -i "s/createtime/$(date '+%H:%M:%S')/g" Newtxt.txt

Outra maneira de corrigir seu problema é alterar o comando mkdir para usar um caminho absoluto. Então, seu script ficaria assim:

#THIS CODE WILL CREATE A DIRECTORY WITH TIME OF CREATION AS PART OF DIRECTORY NAME
 echo "The time is $(date +%H_%M_%S)"
 now=$(date +%H_%M_%S)
 echo $now
 echo $(pwd) 
 #createdep=nowt_$now
 createdep=/home/adhikarisubir/test/basic_unix/nowt_$now  #createdep is now an absolute path
 echo "$createdep"
 mkdir "$createdep"
 #cd nowt_$now
 cd $createdep #this cd command now cds to $createdep
 echo "Current directory is $(pwd)"
 echo "This is a text file which will contain the createtime" > Newtxt.txt
 sed -i "s/createtime/$(date '+%H:%M:%S')/g" Newtxt.txt

É melhor sempre usar caminhos absolutos, então use sempre /home/adhikarisubir/test/basic_unix em vez de dizer test/basic_unix .

Nota: suponho que o seu diretório pessoal seja /home/adhikarisubir .

    
por Alaa Ali 03.12.2014 / 21:59