ラズパイ・Linux:/bin/sh: -c: 行 0: 予期しないトークン `(‘ 周辺に構文エラーがあります」はメタ文字を疑う

Raspberry Pi

わたしの場合、ラズパイのOS RaspbianでPythonからシェルプログラムを呼び出すos.popenコマンドを実行したときに

/bin/sh: -c: 行 0: 予期しないトークン `(‘ 周辺に構文エラーがあります

と表示された。

シェルの引数には、メタ文字といって特殊な意味を持つ文字があるためこのようなことが起こる。
例えばターミナルで

echo Hello

とシェル実行(echoは画面に引数に指定した文字列を表示するコマンド)すれば画面には

Hello

と表示されるのに

echo (Hello)

などとしてしまうと

-bash: 予期しないトークン `Hello’ 周辺に構文エラーがあります

とエラーが表示されてまうのだ。この場合は、()がメタ文字。ほかにも$ & [ ] { } …など沢山ある。

参考

とほほのBash入門 - とほほのWWW入門

もし、画面に

(Hello)

と表示したいのなら、引数をシングルクォーテーションのでくくってメタ文字を無効化することで可能となる。

echo '(Hello)'

実際にエラーが出たPythonスクリプト

# -*- coding: utf-8 -*-
import urllib.request
from bs4 import BeautifulSoup
import re
import os

"""
	お天気情報をサイトから取得する
"""
# Yahoo!のページから水戸の天気を開く
url = "https://weather.yahoo.co.jp/weather/jp/8/4010.html"
data = urllib.request.urlopen(url)

# HTMLを解析して取得
soup = BeautifulSoup(data, 'html.parser')

# classが 'forecastCity' のタグを取得
tenkiAll = soup.find(class_="forecastCity")
date = tenkiAll.find(class_="date")
tenki = tenkiAll.find(class_="pict")
high = tenkiAll.find(class_="high")
low = tenkiAll.find(class_="low")

"""
	画面に出力
"""
# 天気をしゃべるテキストを設定
weatherText = date.text + "今日の天気をお伝えします。"
weatherText += "水戸地方、今日の天気は、" + tenki.text + "。"
weatherText += "最高気温は、" + high.text + "度、"
weatherText += "最低気温は、" + low.text + "度、"
weatherText += "でーーす"
weatherText = weatherText.replace("\n", "")
weatherText = weatherText.replace(" ", "")
print(weatherText)

# 天気をしゃべる
cmd = "/home/pib/aquestalkpi/AquesTalkPi {} | aplay".format(weatherText)
result = os.popen(cmd).readline().strip()

38行目の変数weatherTextをAquesTalkPiというアプリケーションの引数に指定している部分でエラーが出た。

その際の変数weatherTextの中身は以下のような文字列だった。

8月7日()今日の天気をお伝えします。水戸地方、今日の天気は、曇時々雨。最高気温は、31℃[-1]度、最低気温は、25℃[+2]度、でーーす

メタ文字がふんだんに入っていたのだった。

該当のエラー行を以下のように修正して対処した。変数の置き換え部分をでくくっている。

cmd = "/home/pib/aquestalkpi/AquesTalkPi '{}' | aplay".format(weatherText)

コメント

タイトルとURLをコピーしました