タグ

ブックマーク / qiita.com/ko1nksm (5)

  • いい加減シェルスクリプトで [ $? -eq 0 ] や [ $? -ne 0 ] なんて エラー処理を書くのはやめよう! - Qiita

    いい加減シェルスクリプトで [ $? -eq 0 ] や [ $? -ne 0 ] なんて エラー処理を書くのはやめよう!ShellScriptBashLinuxUNIXmacOS はじめに [ $? -eq 0 ] や [ $? -ne 0 ] は冗長でデメリットしかありません。非常に多く見かける書き方ですが、1979 年に Bourne シェルが広く公開された時からこのようなコードは必要ありませんでした。実際に当時はこのような書き方は使われておらず、このような書き方をしなければならなかった歴史的な経緯などはありません。これはなぜか広まってしまった良くない書き方です。 優れたコードとは無駄がないシンプルなコードです。丁寧なコードとは無駄な処理を書くことではありません。[ $? -eq 0 ] や [ $? -ne 0 ] は書かないほうが、簡単で読みやすくわかりやすくなります。優れた文法

    いい加減シェルスクリプトで [ $? -eq 0 ] や [ $? -ne 0 ] なんて エラー処理を書くのはやめよう! - Qiita
    AmaiSaeta
    AmaiSaeta 2024/08/21
    自分の書き方を考えてみると、 `grep` の様な検証・判定を行う場合は `if` の条件として書くが、環境を変える(ファイルコピー等)場合は分けて、無意識に使い分けてる。一般的なプログラミングでどうかに引き摺られてる
  • パイプに関係するさまざまなバッファ、ちゃんと意識していますか? - Qiita

    はじめに コマンドをパイプでつなげた時、各コマンドの間にはいくつかのバッファが存在します。そのバッファについてちゃんと意識しているでしょうか? バッファの存在によって各コマンドの実行には分かりづらい変化があります。そのバッファを知らないと罠にハマってしまう・・・かもしれません。 プロセス間のパイプ通信のバッファ まずプロセス間のパイプ通信に存在しているバッファです。多くのコマンドは行単位でデータを処理しますが、一般的にパイプでつなげた各コマンドはそれぞれ処理速度が異なります。処理がすぐに終わるコマンドもあれば時間がかかるコマンドもあります。各コマンドは並列で動作可能ですが必ずしも並列で動作するわけではありません。 一般論としてパイプライン全体の処理にかかる実時間はパイプでつながったコマンドの中で一番遅いコマンドに足を引っ張られます。いくら並列で動作可能と言ってもデータが到着しなければ処理す

    パイプに関係するさまざまなバッファ、ちゃんと意識していますか? - Qiita
  • シェルスクリプトで安全簡単な二重起動防止・排他/共有ロックの徹底解説 - Qiita

    はじめに シェルスクリプトで二重起動防止やロックをする方法を検索すると、いろいろな方法や書き方が見つかりますが、どれを使えばよいのか、当に正しく動くのか、不安になりますよね? ディレクトリ (mkdir) やシンボリックリンク (ln) を使った独自実装の例も見かけますが、エラー発生時や予期せぬ電源断、CTRL+C で止めたときなどでも問題は発生しないのでしょうか? まず、ディレクトリやシンボリックリンクを使った独自実装はしない。これを肝に銘じてください。シェルスクリプトでのロック管理はとても難しく、一般的な排他制御の知識に加えて、シェルスクリプト特有の問題、シグナルやトラップ、サブシェルや子プロセスの問題、さらには特定のシェル固有の仕様やバグなどさまざまな問題に対処する必要があり大変です。独自実装の例では古いロックファイルが残ってしまい、それをいつどのタイミングで片付ければ安全なのか?

    シェルスクリプトで安全簡単な二重起動防止・排他/共有ロックの徹底解説 - Qiita
  • getoptions を使って面倒なシェルスクリプトのオプション解析コードを自動生成しよう! - Qiita

    はじめに getoptions はシェルスクリプト用のオプションパーサーです。getopts や getopt の代わりに使うことができ、getoptions をインストールするだけで簡単にシェルスクリプトのオプション解析を実装することができます。しかし、不特定の人に配布するシェルスクリプトの場合は getoptions をインストールしてもらうというのは選択肢にならないかもしれません。 でも大丈夫! getoptions はオプションパーサーのジェネレータとして使うこともできます。ジェネレータとして使うと自分でオプションパーサーのコードを書く必要はありません。 オプションパーサーとしての使い方はこちら 「シェルスクリプト(bash等)の引数解析が究極的に簡単になりました」 使い方 オプションパーサーとして使う場合は getoptions コマンドをインストールするだけで使えますが、ジェネ

    getoptions を使って面倒なシェルスクリプトのオプション解析コードを自動生成しよう! - Qiita
  • シェルスクリプト用のPOSIX準拠で高速な前ゼロ削除とtrim関数の実装 〜それ本当に外部コマンド(sed,awk,tr)が必要ですか?〜 - Qiita

    シェルスクリプト用のPOSIX準拠で高速な前ゼロ削除とtrim関数の実装 〜それ当に外部コマンド(sed,awk,tr)が必要ですか?〜ShellScriptBashshellPOSIX はじめに この記事は「シェルスクリプトは ((i=i+1)) ではなく i=$((i+1)) で計算しなければいけない!という話」を書いた時に、そう言えば算術式($((...)))では頭に 0 がついた時に 8 進数とみなされるというささいな問題がありましたねーということで、その解決方法と一般化すればこれは前から書こうと思っていた外部コマンドを使わない trim 関数の実装の話なので、ついでにそれらを紹介する記事です。 このような処理をする場合に外部コマンドを使って実装する人が多いですが、実はシェルのパラメータ展開を利用すればシェルの機能だけで実装することができます。そしてデータが十分小さい場合にはその

    シェルスクリプト用のPOSIX準拠で高速な前ゼロ削除とtrim関数の実装 〜それ本当に外部コマンド(sed,awk,tr)が必要ですか?〜 - Qiita
  • 1