如何毫无解释地传递bash变量?
我有一段bash代码,如下所示:
python "$TM"
问题是,$TM可以是任何字符,包括`字符。当$TM的值是`abc`时,bash会试图把abc当作命令来执行,然后再把参数传给python。
我该如何防止这种情况发生?我怎样才能把$TM的值原封不动地传递,而不被解释?
补充说明
我需要更多的解释。
我正在使用TextMate Bundle Editor,所以bash是通过一个缓冲区($TM_SELECTED_TEXT或$TM_CURRENT_LINE)来调用的。这个缓冲区就是我在TextMate编辑器中选择的内容。bash代码如下:
#!/bin/bash
if [ -n "$TM_SELECTED_TEXT" ]; then
TM="$TM_SELECTED_TEXT"
else
if [ -n "$TM_CURRENT_LINE" ]; then
TM="$TM_CURRENT_LINE"
fi
fi
/usr/bin/python /Users/smcho/smcho/works/prgtask/textmate/repeat.py "$TM"
repeat.py的内容如下:
import sys
inputString = sys.stdin.read().decode('utf-8')
inputString = inputString.rstrip().lstrip()
content = inputString[0:-2]
mark = inputString[-1]
r_num = len(content)
string = "%s\n%s" % (content, mark * r_num)
sys.stdout.write(string)
sys.exit(0)
如果输入是"abc:-",它会把这个字符串转换成"abc\n---"。
问题是,如果输入中包含``字符,bash会在把它作为参数传给python代码之前先进行评估。
4 个回答
-2
你的问题有点模糊,不过你有没有试过用引号把 $TM
括起来,这样可以防止它被拆分,看看能不能解决你的问题:
python "$TM"
0
为什么一开始要用bash作为中介呢?
#!/usr/bin/env python
import os
tm = os.environ.get('TM_SELECTED_TEXT', "") or \
os.environ.get('TM_CURRENT_LINE', "")
等等……
反正你的repeat.py对那个参数也不会有什么作用。
3
我觉得你理解错了。Bash并没有“扩展”TM
,因为它里面有反引号(这样会造成很大的安全隐患),这个变量已经包含了命令的输出。你应该把反引号加上引号,这样就不会发生进程替换了:
$ TM="`ls`"
$ echo $TM
file1 file2
对比:
$ TM="\`ls\`" # or TM='`ls`'
$ echo $TM
`ls`