ターミナルで動くのにAutomatorのシェルではエラー

Automator icon

ターミナルでコマンドを入力すればちゃんと動くのにAutomatorのシェルではエラーになってしまう事案発生。解決方法がわからずやさぐれていましたが判りましたのでその顛末を物語っておきます。

エラー command not found

最初にお断りしておきますが私はコマンドで自在にコンピュータを操ることなどまるでできない一般人です。一般人でもやりたいことがあるので基礎も知らず見よう見まねでコマンド入れて失敗してやさぐれます。

ExifTool

ExifToolという有名なツールがあります。姿を持たぬ類いのツールで、インストールしてもアプリケーションフォルダにアイコンが現れることもありません。ターミナルでコマンドを入力して使います。

Automatorのシェル

このツールでたまに行っている作業をAutomatorで自動化してみようと思って、訳もわからずシェルというものをセットして、テスト的にコマンドを入力してみたんです。

図1 シェルにコマンド入力
図1 シェルにコマンド入力

(ちなみに、このコマンドは指定画像のExifデータをcsvファイルに書き出してくれます。その件は巻末にオマケで書きました)

エラーで何も実行できません。

エラー command not found
図2 エラー command not found

ただのエラーではなくExiftoolにコマンドがありませんと言われます。でもターミナルで試すと問題なく動きまます。コマンドありますよ何言ってんすか。

右上のポップアップが怪しいので「引数として」を選んでみました。

(初めて引数という文字を見かけて20年数年これをいんすうと心で読んでいました。ひきすうと読むと昨年知りました😱)

図3 右上を「引数」に
図3 右上を「引数として」に変更

何やら最初からコードが書かれています。何だろうと思いながらdoとdoneの間が怪しいと、そこに書き入れます。

図5
図5 do と doneの間にコマンド

結果は丸。期待通りに動いた・・・・か、と思いきや、目的箇所にcsvファイルは作成されもせず、何もできていません。音と結果表示だけでした。何これ。まあ、でも一応いい音が鳴って結果は丸になったからさっきよりはましかもしれないな、それに本番ではどうせ変数使うんだからな、と意味不明の心のつぶやきをいたします。

変数

テストではパスを記述していますが本番ではここにパス情報を格納した変数を置かねばなりません。PHPやファイルメーカーでの変数の扱いは知っていますがshellというものについては何も知りません。

デフォルトのコマンドにechoがありましたから、その後ろのSFってやつが前段階で受け取ったFinder項目の変数に違いないと確信して、自信満々に「exiftool -s -csv echo “$f” > exif.csv」と書いてみました。

図6
図6 適当に入れてみた

結果はエラーで動きません。

エラー command not found
図2 エラー command not found

ひょっとして「echo」いらんのか。と、

exiftool -s -csv  "$f" > exif.csv

としてみます。

エラー command not found
図2 エラー command not found

さらに、ちょんちょんいらんのか。こうか。

exiftool -s -csv $f > exif.csv
エラー command not found
図2 エラー command not found

ぜんぜんだめですね。

出鱈目やっていてエラーなのは当たり前なんですが、それより気になるのがエラーの内容です。なぜ「command not found」なのだ。出鱈目書いてんだからもうちょっと違う叱り方というものがあるんじゃないのか。と不信感に包まれます。

解決を探して

ここでスキル0マンのDigitalboo筆者は、変数の指定に問題があるからコマンドが認識できなくなったのだろうと考え、「シェル 変数」などで検索しまくり原因と解決を探ります。

結果、何もわかりませんでした。スキル0はともかく、多少なりともコマンドの書き方のルールくらいは知っているであろうことが前提の記事しかヒットしません。こちらはルールも基礎も知りませんから記事に何が書いてあるのかさえ理解できません。かろうじて、シェルでは変数に仕込むときに$を付けず使用するときに付けるとか、いくつか新事実に触れて役に立ちましたが、遭遇しているエラーについては何もわからぬままです。

command not found

やがて「コマンドがありません」が気になりはじめ、command not found のエラーについて熱血検索してみます。案の定ヒットする記事はスペル間違いやツールのインストール方法ばかりで、ようするにエラーメッセージのままツールがない状態であることが前提になっていました。

ツールはある。でもコマンドがない。ターミナルならある。シェルでは消える。

こんなとんちみたいな問いかけを行っても有効な情報にかすりもしません。唯一「Automatorってほんと駄目」みたいな記事を目にして、ここで熱血デジタル部は少しばかりピンと来ます。

これはおれが悪いんじゃなくてAutomatorが悪いんじゃいのか。その証拠に、ターミナルではちゃんと動くではないか。

昔DOSエラーメッセージの「コマンドまたはファイル名が違います」について、先輩は言いました。「コンピュータに叱られるとき、あなたは悪くない。悪いのはコンピュータのほうなのだ」

DOSエラーでいうと、コマンドとファイル名の区別さえつかないあほぼんであるとコンピュータが自白しているにすぎない。つまりこれと同様の解釈を施すならば、シェルは入力された最初の言葉を理解できていないのである。と、いうことになります。

そういえば検索しまくり賢人のブログを眺めまくっているとき、誰かがそっけなく書いていました。「パスを通せばいいよ」

言葉はわかるが何を言ってるのか意味不明のこの暗号が脳内で輝き始めます。

ターミナルが賢くてAutomatorがあほなのだと仮定すれば、ターミナルはExifToolを見つけて判断できるがAutometerは「それ何どこにある何なん」とよだれたらして呆けているということが想像出来ます。

パスを通せばいいよ

核心に近づいてまいりました。Autometerのシェルは、ExifToolのコマンドを見つけられなかったのではなく、ExifToolそのものを見つけることができなかったのではないのか。パスを書いてきっちり導いてやればいいのかもしれない、ということで導いてみました。

導く課程省略

スキル0マンですから、ExifToolのパスがそもそもわからないとか、そのパスをどこにどんなふうに書くのか、とか、皆目見当もつかず上の例のようにいろんなところに出鱈目に書いては試し書いては試ししていました。馬鹿らしいのでその課程は省略します。

ぼくにもできたシェルコマンド

最終的な答えはこれでした。

図7 動いた
図7 動いた

ついに期待通りに動きました。自動化が一歩前進。

オマケ

正解コードについてオマケで詳細を書いておきます。

ExifToolはメディアファイルのメタデータの取得から書き込み操作いろいろできるオープンソースソフトウェアです。見た目を持たないソフトですから少しハードル高いのですけど、公式にインストーラーが用意されていてものすごく親切です。他のこの手のソフトはまず普通の人にはインストールすること自体が困難ですからね。

ExifTool by Phil Heavey

今回使った命令はこれです。

/usr/local/bin/exiftool -s -csv $f > test66.csv

「exiftool命令 オプション指定 対象ファイル > 結果指定」という構成です。

/usr/local/bin/exiftool 最初のこれがExifToolへのパスとExifToolのコマンドを合体させた一文で、命令であるべき「exiftool」の箇所にパスを付け足すという、想像を超えた対処でした。ターミナルでは「exiftool」とだけ書きます。

-s このオプションはタグ名と内容のフォーマットで出力させます。

-csv 結果をテキストファイルに書き出してくれます。使用するときは最後に「> 目的ファイル名」を記述します。

$f 対象画像ファイルのパスを書くべき箇所です。ここではAutomatorが前段から受け取った内容を格納した変数を指定しています。ターミナルでは目的画像ファイルまたはフォルダをドラッグしてパス入力します。

> test66.csv -csvオプションを使用しているので、書き出されるテキストファイルのパス(ファイル名)を指定しています。この場合ファイル名だけを書いていますのでHomeフォルダ直下に保存されます。

ということで画像のメタデータをテキストファイルに出力させる自動化ステップの一つが完了しました。これを何のためにやってるかというとFileMakerで作っているメディア管理データベースで使うためです。FileMakerで画像インポートとメタデータインポートを一括して行うための部品作りでございました。

 

広告
FileMakerでメディア管理
カテゴリーソフトウェアタグ
このエントリーをはてなブックマークに追加

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください