shell中のコマンド起動には、引用符『’』ではなくバッククォート『`』

  • 2017年6月15日
  • 2021年7月1日
  • TIPS

1.ある日の会話

今日ですね、60爺は師匠の50オヤジと話をしていた中で、「shellの変数名と言うか、shellの中で変数を扱うところがいつもエラーになってしまって動かない」ことを話しました。

すると、さすが師匠です。すぐさま回答をくれました。

それを、会話形式で見てみましょう(50:50オヤジ、60:60爺です)。

50「変数を囲う文字に何を使っています?ひょっとして、『’』(引用符)(shift+7)じゃないですよね?」
60「そうに決まってんじゃん」
50「やっぱり、やだな、『`』バッククォート(shift+@) に決まってんじゃないすか。常識ですよ、常識」
60「素人の60爺に、そんな常識は無い」(開き直り^^;)

2.『`』バッククォートとは

そういう話で、shell中のコマンド起動には『`』バッククォートで囲うのが正しいのだそうです。

この『`』バッククォートの入力は、 shift+@ で行うことができます。

ガーーーン。

皆さん知ってましたか?『`』バッククォートで囲まれた中身は、コマンドが実行できるんです。

知らなかった!

60爺は、こんな文字『`』バッククォートがあることさえ知らなかったんです。

60爺の作る shell は、変数を扱おうとすると、いつもエラーとなって動かない謎が解けました。師匠には、非常識と言われましたが、これで、60爺はひとつ利口になったのです。

読み方は、以下にあるように3通りあるみたいです。

  • バッククォート
  • バックコーテーション
  • アクサングラーブ

ちなみに、shift+7 で入力する『’』の読み方も載せておきます。

  • シングルクオーテーション
  • 引用符
  • アポストロフィ

このバッククォートとシングルクオーテーションですが、ちらりと見ただけでは判断つきませんよねエ…。

3.早速試してみた

早速、動かなかったshellがあるので試してみました。

スピーカテスト用のサンプルです。

こちらは、『’』引用符(shift+7)で書いています。

pi@raspberrypi:~ $ cat sample_web_aplay.sh
#! /bin/sh
# Directry set
d=/usr/share/sounds/alsa
# /usr/share/sounds/alsa
# all file loop
for f in 'ls ${d}' ; do
# aplay command odio file
aplay "$d/$f"
# 1 secont sleep
sleep 1
done

このため、実行すると当然エラーとなります。

pi@raspberrypi:~ $ sudo sh ./sample_web_aplay.sh
/usr/share/sounds/alsa/ls ${d}: そのようなファイルやディレクトリはありません

今日教えてもらった「バッククォート」『`』(shift+@)で書き換えました。

pi@raspberrypi:~ $ cat sample_web_aplay.sh
#! /bin/sh
# Directry set
d=/usr/share/sounds/alsa
# /usr/share/sounds/alsa
# all file loop
for f in `ls ${d}` ; do
# aplay command odio file
aplay "$d/$f"
# 1 secont sleep
sleep 1
done

これで実行すると、指定した wavファイル全てを鳴らしてくれました。すばらしい。

pi@raspberrypi:~ $ sudo sh ./sample_web_aplay.sh
再生中 WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
再生中 WAVE '/usr/share/sounds/alsa/Front_Left.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
再生中 WAVE '/usr/share/sounds/alsa/Front_Right.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
再生中 WAVE '/usr/share/sounds/alsa/Noise.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
再生中 WAVE '/usr/share/sounds/alsa/Rear_Center.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
再生中 WAVE '/usr/share/sounds/alsa/Rear_Left.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
再生中 WAVE '/usr/share/sounds/alsa/Rear_Right.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
再生中 WAVE '/usr/share/sounds/alsa/Side_Left.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
再生中 WAVE '/usr/share/sounds/alsa/Side_Right.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
pi@raspberrypi:~ $

指定のディレクトリの中身を出しておきますね。

pi@raspberrypi:~ $ cd /usr/share/sounds/alsa/
pi@raspberrypi:/usr/share/sounds/alsa $ ls
Front_Center.wav Noise.wav Rear_Right.wav
Front_Left.wav Rear_Center.wav Side_Left.wav
Front_Right.wav Rear_Left.wav Side_Right.wav

まだまだ、知らないことのある Linux の世界。何かわかったら、また報告します。