从 crontab 运行时,Shellscript 在错误的目录中创建目录

从 crontab 运行时,Shellscript 在错误的目录中创建目录

我编写了以下代码,它将创建名称格式为“nowt_hour_minute_second”的目录。在该目录中,将创建另一个包含目录创建时间的文本文件。现在我已将目录创建路径设置为adhikarisubir@ubuntu:~/test/basic_unix。当我手动调用脚本时,目录将在上述目录中创建,但当我从 crontab 运行时,目录将创建在中adhikarisubir@ubuntu:~。以下是我的脚本:

 #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

我的 crontab 命令是:

*/2 * * * * sh test/basic_unix/createfiles.sh

答案1

当您在目录中~/test/basic_unix调用脚本时,您的mkdir "$createdep"命令会在该目录中创建该文件夹,~/test/basic_unix因为这是当前目录,也就是您运行脚本的位置。但是,当您从 cron 运行该脚本时,您开始使用的目录是您的主目录,~因此您的mkdir命令会在那里创建文件夹。

你可能会感到困惑,因为你认为既然你的脚本位于 下~/test/basic_unix/createfiles.sh,那么文件夹就会一直在那里创建,但这是错误的。问题不在于脚本位于哪里,而在于你跑去哪里脚本来自。举个例子,创建一个目录~/testing2,然后cd ~/testing2,然后使用调用你的脚本sh ~/test/basic_unix_createfiles.sh。你会发现你的文件夹是在下创建的~/testing2,而不是~/test/basic_unix。为什么?因为那是你运行脚本的地方,而且因为你的mkdir命令使用的是相对路径,即因为你的mkdir命令是这样的:mkdir foldername,它会在工作目录中创建它。

要解决您的问题,最简单的方法是cd一开始就找到您想要创建文件夹的位置,因此您的脚本将如下所示:

#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

解决问题的另一种方法是将mkdir命令更改为使用绝对路径。因此,您的脚本将如下所示:

#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

最好始终使用绝对路径,因此始终使用/home/adhikarisubir/test/basic_unix而不是说test/basic_unix

注意:我假设您的主目录是/home/adhikarisubir

相关内容