
こんにちは。
シェルスクリプトで謎の現象が起こりまして悩んでいます。
現在、
#!/usr/bin/sh
var='foo'
if [ $? - eq - 0 ]; then
mv xxx.bz2 xxx.old.bz2
echo $var | bzip2 -z >xxx.bz2
fi
といった感じのシェルスクリプトを動かしています。
これを手作業で、
foo | bzip2 -z >xxx.tmp.bz2
とやると、xxx.tmp.bz2は1.2MB程度のファイルとなるのですが、
上記のシェルスクリプトで実行すると8KBほどにしかなりません。
シェルスクリプトの変数のサイズの制限かと思い、調べてみましたが、
特に制限があるとの資料はみつかりませんでした。
fooの出力がバイナリなので、そのせいかとも思ったのですが、unix系列の場合、windowsと違ってテキスト/バイナリの区別はないはずだしということで、理由がわかりません。
シェルの変数には、やはり制限があるのでしょうか?それとも他の理由でしょうか。ご存知の方がいらっしゃいましたら、ご教示お願いします。
環境はsolarisです。バージョンは、
$ cat /etc/release
Solaris 10 8/07 s10s_u4wos_12b SPARC
Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 16 August 2007
です。よろしくお願いします。
No.4ベストアンサー
- 回答日時:
変数と言うより、シェルのコマンドライン長の制約の気がします。
圧縮して1.2MBということはfooの出力は数十~数百MB?
外部コマンド起動の場合は、Linuxだと128KBが上限のようですが、echoは組み込みコマンドなので、もっと上限は大きいはずです。
変数に200MBいれてみると、入りましたけど、echoしてみるとbashが落ちました。SolarisだとOSが違うので、上限も異なると思いますが。
やはり変数に入れない方がいいでしょうね。
foo | bzip2 -z >xxx.tmp.bz2
ただ、ステータスを調べるのは面倒。パイプのステータスはパイプの最終段のコマンドつまりbzip2のステータスになります。
bashだと、${PIPESTATUS[0]} でfooのステータスが取れるのですが、shだとちょっと細工が要ります。
status=`((foo ; echo $? >&3) | bzip2 -z >xxx.tmp.bz2) 3>&1`
if [ $status = 0 ]
then mv xxx.bz2 xxx.old.bz2; mv xxx.tmp.bz2 xxx.bz2
else rm xxx.tmp.bz2
fi
なるほど、ありがとうございます。
どうやら変数に入れないほうがいいのは確かなようですね。
>ただ、ステータスを調べるのは面倒。パイプのステータスはパイプの最終段のコマンドつまりbzip2のステータスになります。
はい、ステータスを調べる必要があるので・・。必要なければ素直に
foo | bzip2 -z >xxx.tmp.bz2
で、よかったのですが。
>status=`((foo ; echo $? >&3) | bzip2 -z >xxx.tmp.bz2) 3>&1`
>if [ $status = 0 ]
>then mv xxx.bz2 xxx.old.bz2; mv xxx.tmp.bz2 xxx.bz2
>else rm xxx.tmp.bz2
>fi
参考になります。試してみます。

No.3
- 回答日時:
んー。
fooの出力結果をbz2で保存したいというのが目的でよいのかな?Solaris は、時々コマンドが微妙に違っていたりするのであまり自信ないですけど
シェルでは、基本的にクォーティングする癖をつけた方がよいですよ。
#!/usr/bin/sh
var="$(foo)"
if [ $? -eq 0 ]; then
mv xxx.bz2 xxx.old.bz2
echo "$var" | bzip2 -zc >xxx.bz2 || echo error
fi
としてみたら、どんなです?
もしうまくいったとしたら、$varに0x0dが混ざっていたのでしょう。
お返事ありがとうございます。
テストコードを書いてみました。
$ cat test.sh
#!/usr/bin/sh
var0="\0015"
var=12345${var0}A
echo $var
echo "$var"
$ test.sh
A2345
A2345
と、なりましたので、どうやら改行が原因ではないようです。
他、
var0="\0042"
としても試してみましたが、結果、
12345"A
12345"A
と、なりましたので、バイナリであることはおそらく問題がないのかなと思います。
いずれにせよ、あまり大きなデータを変数に入れるのは問題があるようなので、変数に入れない方向で考えてみます。
No.2
- 回答日時:
echo は文字列しか処理できないんじゃない?
シェルにも
echo $var | bzip2 -z >xxx.bz2
じゃなくて
foo | bzip2 -z >xxx.tmp.bz2
って書けばどう?
No.1
- 回答日時:
この場合
echo $var = echo foo
だから, 「コマンド foo の出力を bzip2 で圧縮する」んじゃなくて「文字列 foo を bzip2 で圧縮してる」んだよ.
重ねてすみません。
間違えたというのは、転記ミスということです。
うまく動かないスクリプトに書いてあるのは、
var=`foo`
です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux bash のファイルの読み込み方についてご質問 3 2023/05/15 20:40
- UNIX・Linux デフォルト値のパラメータ展開 1 2022/08/12 17:34
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
- その他(プログラミング・Web制作) test([)コマンドによる条件判定 2 2022/08/10 12:28
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- その他(Microsoft Office) パワークエリの複数ファイルのデータ統合について 3 2022/07/14 17:06
- その他(パソコン・周辺機器) チャレンジタッチ3 改造 アプリインストールできない 1 2022/07/01 14:43
- その他(プログラミング・Web制作) zshの例外処理 1 2022/06/02 16:36
- C言語・C++・C# Makefileのechoの展開について 2 2022/07/26 07:35
このQ&Aを見た人はこんなQ&Aも見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
何回やってもうまくいかないことは?
みなさんには、何回やってもうまくいかないことはありますか?
-
今の日本に期待することはなんですか?
目まぐるしく、日本も世界も状況が変わる中、あなたが今の日本に期待することはなんですか?
-
あなたの人生で一番ピンチに陥った瞬間は?
これまでの人生で今振り返ると「あの時、1番ピンチだったなぁ...」という瞬間はありますか?
-
思い出すきっかけは 音楽?におい?景色?
記憶をふと思い出すきっかけは 音楽、におい、景色 どれですか?
-
Linux環境 grepで改行コード(CRLF、LF)を検索できないで
UNIX・Linux
-
bashでシングルクォート内の変数の組み込み方教えてください。
UNIX・Linux
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
batである文字列内に特定の文字...
-
シェルで and/or の優先順位に...
-
シェルスクリプトの変数の制限?
-
Bシェル 文字列に含まれる特...
-
powershellのパイプでテキスト...
-
ファイルから文字列を読み込む...
-
Cシェルで、文字列中(str)に、...
-
Cシェルプログラムで、あるディ...
-
スクリプト中のexportコマンド...
-
Dirコマンドでフォルダ内ファイ...
-
win11のエクスプローラーの右ク...
-
TOPコマンドで表示するCPU使用...
-
Linux環境 grepで改行コード(CR...
-
bashでシングルクォート内の変...
-
スクリプトのエラー「unexpecte...
-
UNIX コマンドにおける # や円...
-
SONYの音楽ソフト「x-アプリ」...
-
pingは正常なのにtracerouteで...
-
エクセルの表にヘンな枠が・・・
-
SCコマンドでアクセス拒否
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batである文字列内に特定の文字...
-
スクリプト中のexportコマンド...
-
シェルスクリプトの変数の制限?
-
ファイルから文字列を読み込む...
-
if文について
-
Bシェル 文字列に含まれる特...
-
【シェルスクリプト】 for文で...
-
bashスクリプト
-
Cシェルで標準エラー出力への...
-
sh スクリプト ipアドレス形式...
-
sedなどで、特定の文字列からタ...
-
UWSCについて
-
【sh】tee コマンドの代替方法
-
文字列の一部を取り除きたい(...
-
cshの条件式について教えてくだ...
-
Cシェルプログラムで、あるディ...
-
シェルスクリプトでうるう年判定
-
シェルで and/or の優先順位に...
-
shellスクリプトから別のshell...
-
【シェルスクリプト】whileルー...
おすすめ情報