我有一个bash代码如下
python "$TM"
问题是$ TM可以是任何字符,包括`字符。当$ TM有`abc`时,bash会尝试将abc作为命令运行,然后再向python提供参数。
我该怎样防止这种情况?如何在没有任何解释的情况下从字面上传递$ TM?
我需要更多解释。
我正在使用TextMate Bundle Editer,因此使用缓冲区($ TM_SELECTED_TEXT或$ TM_CURRENT_LINE)调用bash。缓冲区是我在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代码之前对其进行评估。
答案 0 :(得分:3)
我认为你弄错了。 Bash没有“扩展”TM
,因为它包含反引号(这将是一个可怕的安全漏洞),变量已经包含命令的输出。您应引用反引号以防止进程替换:
$ TM="`ls`"
$ echo $TM
file1 file2
VS
$ TM="\`ls\`" # or TM='`ls`'
$ echo $TM
`ls`
答案 1 :(得分:0)
为什么首先使用bash作为中介?
#!/usr/bin/env python
import os
tm = os.environ.get('TM_SELECTED_TEXT', "") or \
os.environ.get('TM_CURRENT_LINE', "")
依旧......
无论如何,你的repeat.py不会对这个论点做任何事情。
答案 2 :(得分:-1)
您的问题有点模糊,但您是否尝试过引用$TM
以防止分词来解决您的问题:
python "$TM"
答案 3 :(得分:-1)
python "$TM"