![从 crontab 运行时,Shellscript 在错误的目录中创建目录](https://linux22.com/image/1123112/%E4%BB%8E%20crontab%20%E8%BF%90%E8%A1%8C%E6%97%B6%EF%BC%8CShellscript%20%E5%9C%A8%E9%94%99%E8%AF%AF%E7%9A%84%E7%9B%AE%E5%BD%95%E4%B8%AD%E5%88%9B%E5%BB%BA%E7%9B%AE%E5%BD%95.png)
我编写了以下代码,它将创建名称格式为“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
。