python中的bash rsync脚本奇怪

我有这个问题在python中的bash。 我想制作脚本,使基于系统date的文件夹 – 这工作得很好。 问题是,当我想rsync两个目录与​​我的文件备份和其他名称与系统date创build。

import os f = os.system("bash -c 'DATE=folder-`date +%y%m%d;mkdir /home/lol/$DATE;'") g = os.system("bash -c 'rsync -av /folderToBackup/ /home/lol/$DATE/;'") 

而当rsync复制文件,他们都在/ home / lol /不在/ home / lol / $ DATE

请如果有人知道解决scheme,我试过不同的目录和rsynced文件总是落在创build文件夹与date但更高,例如在/ home / lol /

在第二行中, $DATE没有被定义,因为你开始一个新的shell,并且它已经失去了第一个调用的variables定义。

你为什么不把它封装到一个shell脚本中,或者从Python提供date? 为什么你用Python呢? 坦率地说,你的方法是荒谬的。

 $!/bin/bash DATE=folder-`date +%y%m%d;mkdir /home/lol/$DATE rsync -av /folderToBackup/ /home/lol/$DATE/ 

在你的例子中,你开始一个bash,并设置了DATEvariables,所以DATEvariables只在这个bash过程中可用。 当你开始一个新的bash(你的rsync)时,你没有设置一个DATEvariables。 当你读这个variables时,它是空的。 这就是为什么你复制到/ home / lol。 所以你的脚本只需在第二个(rsync)bash进程中设置DATEvariables。

我认为你的目标更好的解决scheme是使用Python的date时间和makedirs 。 然后为rsync启动一个os.system bash进程。

问题是你处理variables$ DATE的方式。 这个variables对于第一次执行是可见的(当你创build具有所需date的目录时)。 当脚本尝试执行rsync时,这个$ DATEvariables的内容对于os.system()的第二次执行是未知的。 所以你需要以某种方式将这个值从第一次执行传递到第二次执行。

您可以探索Python模块的“subprocess”,这比os模块更好,可以实现这种结果。 在这里我的testing:

 from subprocess import PIPE from subprocess import Popen def exec_and_show(command): process = Popen( args=command, stdout=PIPE, shell=True ) return process.communicate()[0] my_folder = exec_and_show("bash -c 'DATE=folder-`date +%y%m%d`;mkdir /home/lol/$DATE;echo $DATE'") print "My folder is: {0}".format(my_folder) 

当然,我不会像这样使用编程语言来执行两行代码。 其他一些解决使用shell脚本问题的答案是更好的。 不仅仅是因为解决scheme比较简单(只有两行代码),而且还包含了简单性(例如未来的维护)中的所有内容。