質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.61%

sedで変換しての変数代入に失敗する

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 3,308

ユーザーランキング総合1位

 現象

Windowsでgitを使う中で、git for windowsのシェル内でシェルスクリプトを回して処理を行っていたのですが、Windowsをリカバリして再インストールしたところでうまく動かなくなってしまいました。

原因を追いかけていったところ、以下のような部分が問題となっていそうだと判明しました(再現する範囲でソースは書き換えています)。

#!/bin/bash
set -e

# 中略

for FILE in `find (後略)`
do
  # 次の行で死ぬ
  ORIG_FILE=`echo $FILE | sed -e 's/\.gz$//'`
  if ! [ -f "${ORIG_FILE}" ] ; then
    # 略
  fi
done

findが正常に動作しているのは確認しましたし、$FILEにも値は来ています。echo $FILE | sed -e 's/\.gz$//'も、単体で実行した時は正常に動作しました。ところが、変数代入しようとするとここで止まって、$?は127という値となっていました。

怪我の功名で、bashだと${FILE/\.gz$/}のような形でsedを使わずに動くことが判明したので、実用的には一件落着となりました。ただ、もとのコードがなぜ動かなかったのか判然としないのも気持ち悪いので、改めて質問する次第です。

 質問内容

  • 上の書き方で動かないのは環境要因なのか、書き方の問題なのか
  • bash拡張を使わずにきちんと動かすにはどうすればいいのか

 環境情報

  • Windows 7 x64
  • シェル環境…git version 2.9.2.windows.1付属のGit bash(MinGW64系)
  • uname -aの結果 MINGW64_NT-6.1 (PC名) 2.5.0(0.295/5/3) 2016-03-31 18:47 x86_64 Msys
  • which sedwhich echoの先は/usr/bin/***
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

check解決した方法

0

どうやら、MacTypeが干渉していたのが原因のようでした(参考)。

MacTypeの適用対象からshやbashを除外することで、問題は落ち着きました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

Windowsをリカバリして再インストールしたところでうまく動かなくなって

動かしたものは全く同じものだったのでしょうか。
こういった謎現象は改行コードが原因となることがたまにあります。
unix関係のインタープリターはLFを前提としているものが
よくありますが、このスクリプトはCRLFだったりしませんかね。
まあ、カンで申し訳ないスけど。(^_^;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/18 09:13

    LF改行だということは確認しました。あと、Gitをスペース入りのフォルダに入れていたのが問題かなと思って入れなおしましたが、特に状況変化はありませんでした。

    キャンセル

0

スクリプトに問題は無いので、環境問題だと思います。
とりえあえず、set -xして実行してみて下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/18 14:19

    ということは、エラーの原因はsedもしくはパイプですね。
    ORIG_FILE=`echo ${FILE/.gz$/} | cat`
    で、sedかパイプかが切り分けられると思います。

    > ${FILE%.gz}とすればshでも通る書き方になるということで、
    shとはなにかによりますがが、オリジナルのshにはそういうの無いです。ash とか dash のことですかね?

    キャンセル

  • 2016/08/18 14:27

    ${変数%取り除く末尾}は、POSIXの範囲内ということで間違いなさそうです(POSIX前のshでは動かないかもしれませんが)。

    http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_02

    キャンセル

  • 2016/08/18 21:34

    >POSIX
    なるほど。1980年代のSystemIIIや、1992年のSunOS4.1.3のshには無かったです。

    キャンセル

0

次のようにするとどうでしょうか。

ORIG_FILE=`echo $FILE | sed -e 's/\\.gz\$//'`

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る