こんにちは。
シェルスクリプトで謎の現象が起こりまして悩んでいます。
現在、
#!/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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Pythonのエラーメッセージをコ...
-
vba クリップボードクリアにつ...
-
フロントエンドエンジニアをし...
-
Google ColaboでGUI作成
-
アセンブリ言語について。
-
プログラミングのやり方ざっく...
-
fortran write文について マチ...
-
コトリン言語について。
-
matplotlibで任意の角度の円弧...
-
Pythonで指定時間までスリープ...
-
特定の項目セルにスキャン(入...
-
JRのjsonファイルって使って大...
-
AIのプログラムについて教えて...
-
VBSでテキストファイルの2行目...
-
AIの登場でプログラマーたちが...
-
VBAでパワーシェルを実行したい...
-
フリーランスのエンジニアって...
-
Selenium4でボタンをクリックで...
-
Lazarus(IDE2.2.6)をインスト...
-
プログラミングについて プログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batである文字列内に特定の文字...
-
スクリプト中のexportコマンド...
-
if文について
-
シェルスクリプトの変数の制限?
-
Bシェル 文字列に含まれる特...
-
kshでのNULLの比較
-
ファイルから文字列を読み込む...
-
bashスクリプト
-
【sh】tee コマンドの代替方法
-
shellスクリプトから別のshell...
-
Cシェルプログラムで、あるディ...
-
exprで四則演算をする際に変数...
-
【シェルスクリプト】 ローカル...
-
シェルで and/or の優先順位に...
-
シェルスクリプトでうるう年判定
-
【シェルスクリプト】 for文で...
-
rubyで、バッククォートの中に...
-
cshの条件式について教えてくだ...
-
Bashでキーボードから入力は?
-
zshの例外処理
おすすめ情報