Bash变量包含'\r' - 回车导致脚本问题
我有一个bash脚本(rsync.sh
),它运行得很好,其中有这么一行:
python /path/to/rsync_script.py $EMAIL "$RSYNC $PATH1 $PATH1_BACKUP"
我想把这个命令分成两部分,其实它比这里显示的要长,因为我的变量名字更长,我想用类似这样的方式:
python /path/to/rsync_script.py \
$EMAIL "$RSYNC $PATH1 $PATH1_BACKUP"
但是当我这么做的时候,我遇到了一个错误:
scripts/rsync.sh: line 32: $'admin@mydomain.com\r': command not found
它在里面加了一个回车符,\r
。
我该如何分开这一行,并且不让回车符出现呢?
3 个回答
如果你能修改这个Python脚本,可能直接把变量名传给它会更简单,而不是传变量的内容。
在Python代码里,你可以更好地处理空白字符(比如\r),这些工具比在bash里要好用和一致得多。
要做到这一点,只需把你的.sh文件中的这一行改成:
python /path/to/rsync_script.py EMAIL "RSYNC PATH1 PATH1_BACKUP"
然后在你的rsync_script.py里,使用os.environ来读取shell变量的内容(并清除里面的\r字符)——大概是这样的:
import os, sys
paths = []
for var_name in sys.argv(2).split(" "):
paths.append(os.environ[var_name].strip())
这个问题看起来像是Windows系统的换行符。
下面是你可以在Python中检查的方法。
repr(open('rsync.sh', 'rb').read())
# If you see any \\r\\n, it's windows
接下来是如何解决这个问题的方法:
text = open('rsync.sh', 'r').read().replace('\r\n', '\n')
open('rsync.sh', 'wb').write(text)
编辑
这里有段代码展示了这个问题。
# Python:
open('abc-n.sh', 'wb').write('echo abc \\' + '\n' + 'def')
open('abc-r-n.sh', 'wb').write('echo abc \\' + '\r\n' + 'def')
然后运行我们刚才创建的文件……
$ sh abc-n.sh
abc def
$ sh abc-r-n.sh
abc
abc-r-n.sh: 2: def: not found
我搞明白了……我在这个问题上犯了个错误,虽然得到了很多很棒的帮助,但其实是我自己做了个傻事导致了问题。正如我之前提到的,我可能在某个时候从Windows复制粘贴了内容(我忘了,因为大部分编辑都是在vim里完成的)。我回去写了一个简短的脚本,保留了原来的核心内容,然后加上了换行的'\',结果这个脚本就正常工作了。我觉得接受自己的答案有点不好意思,因为实在太傻了。我确保给所有帮助我的人都点了赞。再次感谢大家。