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

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

新規登録して質問してみよう
ただいま回答率
85.50%
sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

Q&A

解決済

4回答

4204閲覧

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

maisumakun

総合スコア145121

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

0グッド

0クリップ

投稿2016/08/17 07:45

現象

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

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

bash

1#!/bin/bash 2set -e 3 4# 中略 5 6for FILE in `find (後略)` 7do 8 # 次の行で死ぬ 9 ORIG_FILE=`echo $FILE | sed -e 's/\.gz$//'` 10 if ! [ -f "${ORIG_FILE}" ] ; then 11 # 略 12 fi 13done

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/***

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

自己解決

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

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

投稿2017/07/26 22:56

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

lang

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

投稿2016/10/15 09:53

ikedas

総合スコア4227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2016/08/17 12:24

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2016/08/18 00:18

set -exで実行したところ、 ++ find (後略) + for FILE in '`find (後略)`' + ORIG_FILE= のようになって終了しました(空行はコメント欄の都合上入れてあります)。
otn

2016/08/18 04:16

不思議ですね。 + ORIG_FILE= の前に ++ echo ~~ ++ sed ~~ が無い。 切り分けのために、 ORIG_FILE=`echo ${FILE/.gz$/}` に修正してみて下さい。(質問文では、\.gz となっていますが、ここは正規表現じゃないので\は不要です)
maisumakun

2016/08/18 04:42

++ find (後略) + for FILE in '`find (後略)`' ++ echo (中略).css.gz + ORIG_FILE=(中略).css.gz と、.gzの置換が効かないということになってしまいました。 (動かない問題とは別件ですが)さらに知ったこととして、${FILE%.gz}とすればshでも通る書き方になるということで、本題だった問題は完全に解決した感がありますが、とはいえこんな具合では既存のシェルスクリプトが動かないトラブルに巻きこまれそうなので、調査は続けようと思います。
otn

2016/08/18 05:19

ということは、エラーの原因はsedもしくはパイプですね。 ORIG_FILE=`echo ${FILE/.gz$/} | cat` で、sedかパイプかが切り分けられると思います。 > ${FILE%.gz}とすればshでも通る書き方になるということで、 shとはなにかによりますがが、オリジナルのshにはそういうの無いです。ash とか dash のことですかね?
otn

2016/08/18 12:34

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

0

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

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

投稿2016/08/17 09:22

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2016/08/18 00:13

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問