みたいです。
これはちょっとハマりました。
ヒアドキュメントとは
ヒアドキュメントという機能を知っていますでしょうか?
簡単に言えば複数行で文字列を表示させる機能です。
Qiitaで探すといっぱいでてきます。
詳しい機能は下記など、いろいろ探してみてください。
qiita.com
ざっくり使い方
コマンドは下記のように使えます。
$ cat << EOF > aaa > bbb > ccc > EOF aaa bbb ccc
シェルスクリプト
もちろん同じようにシェルスクリプトで使うこともできます。
eof_test.sh cat << EOF aaa bbb ccc ddd EOF
でなにが問題か?
functionで使ってみる
function内で使おうとすると、下記のようにインデントを入れて使いたくなります。
eof_test.sh function hoge() { cat << EOF hoge EOF } hoge
でこれを実行するとエラーになります。
eof_test.sh: 行 7: 警告: ヒアドキュメントの 3 行目でファイル終了 (EOF) に達しました (`EOF' が必要) eof_test.sh: 行 8: 構文エラー: 予期しないファイル終了 (EOF) です
なのでEOFがある行の行頭スペースを除けばOKです。
function hoge() { cat << EOF #cat << EOF ←この行も行頭スペースなしにしてもいい hoge EOF # ←この行頭スペースを省く } hoge
これがzshで実行すると…?
でここが核心なのですが、たまたまこのようなスクリプトをzshで実行してたんですね。
zshで実行するとエラーログがこんなのでます。
eof_test.zsh:7: parse error near `\n'
なんのエラーなのかわからない!!!(ToT;;)
shで実行した場合はこんな風にでます。
eof_test.sh: 行 7: 警告: ヒアドキュメントの 3 行目でファイル終了 (EOF) に達しました (`EOF' が必要) eof_test.sh: 行 8: 構文エラー: 予期しないファイル終了 (EOF) です
なので、あーEOF付近のエラーだなと推測がつくのですが
zshは全然どこが悪いのか推測がつかなかったので
かなり時間を浪費しました。
しかもエラーが出た時は数百行のスクリプトのかなり上の方にEOFを書いてて
エラー指摘の行が一番最後だったので、エラー原因を探るのにかなり苦労しました…。
このことが誰かの役に立ちますように。。。
(シェルに関連したこんな記事もあります)
シェルコマンドのオプションの意味ならこれが便利! - S氏はたまにblogを更新してます
シェルスクリプト内で計算処理したい - S氏はたまにblogを更新してます
【シェルスクリプト】タブ区切りファイル(tsv形式)を読み込むには - S氏はたまにblogを更新してます
【PR】搾取されてない.....!?
客先常駐で働いているエンジニアの方お疲れ様です。
IT業界でSESとして働いている人は多いんですが、自分のマージンや月額単価を知らない人がけっこう多いみたいですね。
自分もそうでした。(^^;)
でもそれかなりもったいないですよ。理由はこちらリツアンSTCの紹介記事を見てみてください。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
blog.suganoo.net
[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)
- 作者: 山森丈範
- 出版社/メーカー: 技術評論社
- 発売日: 2017/01/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
- 作者: ブルース・ブリン,Bruce Blinn,山下哲典
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2003/02
- メディア: 単行本
- 購入: 18人 クリック: 331回
- この商品を含むブログ (64件) を見る
- 作者: 三宅英明
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2017/11/21
- メディア: Kindle版
- この商品を含むブログを見る