如何毫无解释地传递bash变量?

0 投票
4 回答
1122 浏览
提问于 2025-04-16 12:51

我有一段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`

撰写回答