• ベストアンサー

macOS Sierraを使っています。bashが

macOS Sierraを使っています。bashが一定回数以上のループを実行した際、強制終了するようですが、強制終了させない方法はありませんか? よろしくお願いします。

  • inshin
  • お礼率78% (104/133)

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4844/10254)
回答No.4

>(( i-- )) >echo -n "$i " >がdo部分で、 >(( i > 0 )) >がwhileの条件になっています。 i=10000 while ((i--)) echo -n "$i " ((i>0)) do : done doの直前のコマンドのステータスがループ条件になります。do 部は何もしないコマンド : で。

inshin
質問者

お礼

問題なくできました。whileの条件部分で複数コマンドを実行できることを利用して実現するとは思いつきませんでした。 ありがとうございました。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4844/10254)
回答No.3

> bashにdo~while文がないので 同等のことは出来ますけど、Cのdo while相当があるとしたら、どう書きたいですか? ちなみに、CentOS6.8 だとエラーになりませんでした。 ulimit -a の結果を載せておきます。 $ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 3885 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 <====10メガバイトですね。 cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited

inshin
質問者

お礼

ご回答いただきまして、ありがとうございます。 どう書きたいかと言いますと… No.1のお礼コメントのtest1関数がdo~whileの形式になっています。 (( i-- )) echo -n "$i " がdo部分で、 (( i > 0 )) がwhileの条件になっています。 よろしくお願いいたします。

  • hiodraiu
  • ベストアンサー率15% (447/2818)
回答No.2

No.1です 補足にあったコードを実行させた所、「Segmentation fault: 11」が出てました。また、このコードは関数を再帰的に呼んでますよね。bashの関数コール時の動作のについては詳しくないのですが、C言語などと同じように関数コールでスタックを消費するようなものであれば、2,000回ほどの再帰呼び出しで、スタックを消費してしまっているのではないでしょうか。 スタックサイズの不足が問題なら、サイズを変更すればと思ったのですが、どうも出来ないみたいですね。 役に立たない回答で申し訳ないです。

inshin
質問者

お礼

ご回答いただきまして、ありがとうございます。 関数の再帰実行が原因なんですね。 bashにdo~while文がないのでこのやり方にしているのですが、もっとリソースを効率的に利用する方法があれば良いのですが…

  • hiodraiu
  • ベストアンサー率15% (447/2818)
回答No.1

簡単なコードで、取り敢えずループカウンタを表示させて一千万を超えましたが、まだ動いてます。質問者様の仰る一定回数って何回ですか。本当にループの回数が原因ですか。 ~~~~~~ コード ~~~~~~~ #!/bin/bash count=0 while : do echo $count let count++ done

inshin
質問者

お礼

ご回答いただきまして、ありがとうございます。 実行したコマンドは以下の通りになります。 test1(){ (( i-- )) echo -n "$i " if (( i > 0 )) then ${FUNCNAME[0]} $* fi } i=10000 test1 と実行すると、8008で [プロセスが完了しました] になります。 よろしくお願い致します。

関連するQ&A

  • macOS Sierra上でVueScanは

    macOS Sierra上でVueScanは動きますか? 現在、iMac21.5Mid2011 OSX El CapitanでVueScanを使いNikon COOLSCAN V EDでフイルムをスキャンしております。 先日、macOS Sierraがダウンロードされた とのメッセージが表示され、あとはインストールするだけになっております。 プリンターはCanon iP4700で、すでにメーカーはドライバーの対応は止めていますがOSXの対応でプリントできているので、macOS Sierraになってもプリントできるのではないかと期待しております。 Nikon COOLSCAN V EDもすでにドライバーの対応はないのでVueScanを使いスキャンしております。 VueScanがmacOS Sierraに対応しているかどうか自分なりに調べたのですが、OSX El Capitan用のソフトのダウンロードの案内(http://translate.google.com/translate?u=http://www.hamrick.com/vuescan/vuescan.htm&hl=ja&ie=UTF8&sl=en&tl=ja)は見つかったのですがmacOS Sierra用のは見つけられませんでした。 以前のバージョンからの変更点(http://www.hamrick.com/vuescan/vuescan.htm)で、バージョン9.5.28の新機能 では、El Capitanへの対応を記載している。 → Mac OS Xのサポートを改善10.11(エル・キャピタン) 現在、バージョン9.5.58ですが、macOS Sierra対応の記載は見当たりません。 macOS Sierraに対応できていないのであればmacOSのインストールをしないつもりですが、これ以上の調べる方法がわかりません。 VueScanご使用の方のご意見をお願いします。

    • ベストアンサー
    • Mac
  • SierraからHight Sierraへのアップ

    SierraからHight Sierraへのアップグレードを行おうとすると、「このディスクはコンピュータの起動ディスクには使用できません」と出てきました。 以前、bootcampの削除に失敗した経験があり、なんとかパーティションの結合はできたつもりだったのですが、できていないようで、それらが原因と思い、コマンドを開き diskutil listを実行するとこのような表示になったのですが、解決方法はありますか? HDDは1.02TBのFusion Driveです

    • 締切済み
    • Mac
  • mac sierraの写真アプリ再インストール

    インストールしたmacos sierraの写真アプリを削除してしまったのですが、再インストールする方法を教えて下さい。

    • ベストアンサー
    • Mac
  • bash カウントダウンさせたい。

    shellについて初めて勉強しています。 引数で指定した時間をカウントダウンする bashのファイルを作成しているのですが, どのようにしたらよいでしょうか? 引数が一つの時はその引数を秒数として扱い,引数が二つ以上の時は一つ目の引数を分数, 二つ目の引数を秒数として「x分y秒」と表示したいです。 sleepコマンドに引数として秒数を渡すと,その秒数だけ実行が止まるのではないかと思います。 具体的な #!/bin/bash この続きをよろしくお願いします。

  • シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。

    シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。 ファイル名を変更するシェルスクリプトをbashで行おうとプログラムを作成したのですが、 実行するとbad interpreter: ディレクトリではありません とメッセージが出て終了します。記述に誤りがあるのか、実行の仕方が悪いのか分かりません。教えて下さい。 シェルの記述内容は ファイル名をtest.sh #!/bin/bash/ -f mv A.txt A.ori exit 実行方法として #>chmod x+a test.sh #>./test.sh で行いました。そうしたら、bad interpreter: ディレクトリーではありません とメッセージが出ます。 ちなみに #>. test.sh で実行するとターミナルがシェルの実行と同時に閉じてしまいますが、シェルを実行したディレクトリーを確認すると、処理が終わっておりました。

  • MG7130 sierraディスク印刷不具合

    Canon MG7130 を使っていますが MacOSをsierraにアップデートしたらディスク印刷ができなくなりました。 印刷ボタンがでてディスクをセットして印刷しようとするんですが 少しして白紙ででてきます。 改善方法はあるのでしょうか? ※OKWaveより補足:「キヤノン製品」についての質問です。

  • Bash on Windowsであることを判断する

    最近、Bash on WIndowsでrailsの開発をしています。 他の人は、MacかUbuntuなどで動かしているようなことをBash on WIndowsでやっていると、どうしてもこの設定ファイルのこの箇所をWindows向けに書き換えたいと言うのがポツポツと出てしまうので、そう言うときに、自分はBash on WIndowsで動いているシェルかどうか判断したいのですが、そのための方法は無いでしょうか? 例えばredhat系である場合`cat /etc/redhat-release`を実行するとか、そう言う感じのものです。

  • バッチ処理中のコマンドの自動強制終了

    Windows7で、バッチファイルから複数のコマンドを実行しています。 あるコマンドの実行が一定時間以上になったらそのコマンドを強制終了して、次のコマンドに移るようにする方法を教えてください。 例えば、下記のバッチファイルがあるとします。 バッチファイル開始 programA programB programC バッチファイル終了 以上を実行した際に、programBの実行時間が1分以上になったらprogramBを自動的に強制終了して 次のprogramCを実行する必要があります。 また、ユーザーが起動するプログラムは、上記のバッチプログラムだけとします。 また、ダイアログボックスやメッセージwindow等のGUIは表示したくないです。 このようなことを実現する方法を教えてください。

  • bashのシェルスクリプトの書き方

    macos x 10.5.5です。 あるコマンドを実行すると"y/n"を聞いてきます。コマンドラインから実行した場合は、単純にキーボードから"y"などと入力すれば済むわけですが、これをbashのシェルスクリプトでやる場合はどう書けば良いのでしょうか。尚、"y/n"に対する応答(キー入力)は常に"y"で構いません。 >hoge delete file1 -- hogeというコマンドを実行 >Are you sure ? ( enter y/n ) -- hogeが確認を要求 >y -- キーボードからyを入力 よろしくお願いします。

  • Linuxのシェル(sh,bash等)について

    Linux上でコマンドを実行するとき、その窓口となるものが、シェル(sh,bash)という認識です。 つまり、 (1)CUI環境でLinuxを操作する上で、シェル以外でコマンドを実行する事はありうるのか? (2)Windowsのコマンドプロンプトも一種のシェルと言えるか 以上、2点についてお教え頂きたいです。 宜しくお願いします。