如何在没有任何解释的情况下直接传递bash变量?

时间:2011-03-02 19:56:01

标签: python bash parameters

我有一个bash代码如下

python "$TM"

问题是$ TM可以是任何字符,包括`字符。当$ TM有`abc`时,bash会尝试将abc作为命令运行,然后再向python提供参数。

我该怎样防止这种情况?如何在没有任何解释的情况下从字面上传递$ TM?

ADDED

我需要更多解释。

我正在使用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代码之前对其进行评估。

4 个答案:

答案 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"