簡體   English   中英

我如何在沒有任何解釋的情況下按字面值傳遞bash變量?

[英]How can I pass the bash variable literally without any interpretation?

我有一個bash代碼如下

python "$TM"

問題在於$ TM可以是任何字符,包括`字符。 當$ TM具有abc時,bash會在將其參數賦予python之前嘗試將abc作為命令運行。

我該如何預防? 我如何才能在沒有任何解釋的情況下按原樣通過$ 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代碼。

我認為您做錯了。 Bash沒有“擴展” TM因為它包含反引號(這將是一個嚴重的安全漏洞),該變量已經包含命令的輸出。 您應該引用反引號,以防止發生進程替換:

$ TM="`ls`"
$ echo $TM
file1 file2

vs:

$ TM="\`ls\`" # or TM='`ls`'
$ echo $TM
`ls`

為什么首先使用bash作為中介?

#!/usr/bin/env python

import os

tm = os.environ.get('TM_SELECTED_TEXT', "") or \
     os.environ.get('TM_CURRENT_LINE', "")

等等…

無論如何,您的repeat.py不會對該參數做任何事情。

您的問題有點含糊,但您是否嘗試過引用$TM來防止單詞拆分解決了您的問題:

python "$TM"
python "$TM"
\n

        

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM