Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
今回実現すること シェルスクリプトの途中でエラーが発生した(コマンドの終了ステータスが 0 以外だった)とき、スクリプトを中断し、エラー発生時の環境情報を出力する。実行例は以下。 $ ./sample1.sh aa "bb" "cc dd" hello mondai hassei ← ここで問題発生 ------------------------------------------------------------ Error occured on ./sample1.sh [Line 8]: Status 1 PID: 3888 User: kobake Current directory: /test/shell Command line: ./sample1.sh "aa" "bb" "cc dd" ----------------------------------------
bashスクリプトのデバッグ手法として、擬似シグナルERRを使用して、エラー発生時にスクリプトを以下のような方法を使っていた。 (オライリーのbash本に書いてあるようでよく見かける) trap function ERR 最近、サブルーチン内でのエラーが拾えずスクリプトが最後まで言ってしまう場合が場合があったので少し調べてみた。 擬似シグナルERRの条件をマニュアルで調べると "コマンドや関数が非ゼロなリターンコードを返した場合の擬似シグナル" サブルーチンの途中でエラーが起きてもその後のコマンドが正常終了すればサブルーチンはゼロを返してしまう。 そうすると「コマンド」や「関数」が非ゼロを返さないことになるので、trapできないのが原因か。。。納得。 いろいろ考えたが、結局サブルーチンを多用するようなbashスクリプトではERRはそぐわないと考え、暫定対処として、set -eを行いエラー発
EF15形は高性能な電気機関車であったが、引き出し性能が蒸気機関車に劣ると誤解されていた。 誤った運転方法により本来の性能を引き出せていなかったのである。 (spaceaero2 [CC BY 3.0], ウィキメディア・コモンズより) こんにちは、エムスリー・エンジニアリングG・基盤開発チーム小本です。 WEBサイトは RailsやSpringなどの「本体部分」だけでは完結しません。レポート作成・データ更新などの細かい処理も必要です。 過去にはこうした用途にはBashがよく使われました。しかし、Bashは落とし穴が多かったり、クラスなどの抽象化機能がなかったりして、規模が大きくなると辛くなります。 そこで、Bashの代替候補に挙がるのがPythonです。エムスリーでもかつてはBashを使っていましたが、現在は新規案件にはPythonを推奨しています。 しかし、実際にPythonで書き直そ
こんにちは。 マネーフォワードでアグリゲーション開発を担当しています中川です。 今回のブログは、私が bash スクリプトを書く際に心がけている事のおさらいをします。 知ってて当たり前のことかも知れませんが、意外と理解されていないアレです。 では、私が bash スクリプトを書く際によく使う記述を一つずつ紹介します。 2種類の shebang シェルスクリプトの一行目に必ず記述する #! で始まる行を shebang と言います。 bash スクリプトの shebang は、bash を絶対パスで指定する方法と、env を使って指定する方法の二種類あります。 bash を絶対パスを指定する方法 #!/bin/bash env を使ってを指定する方法 #!/usr/bin/env bash 前者は /bin/bash が使われます。 (/bin/bash が存在しなければスクリプトの起動時に
ふみやす@元シェルまおう(自称でない) @satoh_fumiyasu Perl では最初に use strict; use warnings すべきなように、シェルでは set -u すべき。「例外処理って何? おいしいの?」って人は set -e もしておけ。 2012-06-25 18:25:20 ふみやす@元シェルまおう(自称でない) @satoh_fumiyasu シェルスクリプトをまともに書けない奴は、それでも書かなければならないときは、とりあえず変数展開するとき必ずダブルクォートで括れよ。$foo じゃなくて "$foo” な。あと最初に set -u; set -e でもしておきな。シェルスクリプトが駄目なんじゃなくて、書けないだけ。 2012-12-22 00:27:38
先日紹介したシェルスクリプトで「ビルドスクリプト」を作る時に便利なテクニックへのコメントとして「なぜMakefileでやらないのか」「Makefileの方がいいのではないか」といったものがありました。確かにmakeはメジャーなビルドツールなので、そのような疑問が出てくるのも当然でしょう。 なぜシェルスクリプトなのかということの理由はいくつかあります。 1つは、先のエントリの題材としたスクリプトが元々はWindows用のバッチファイルをLinuxのシェルスクリプトに移植したものだったからという理由です。Windowsのバッチファイルのベタ移植として作成したシェルスクリプトを継続的にメンテナンスしてきた間の改良の結果として、いくつかのテクニックが盛り込まれるようになったため、そのテクニックにスポットを当てて紹介しようというのが、先のエントリの発端でした。 もう1つは、シェルスクリプトは「シェル
プログラムの種類によっては、そのまま実行できるものと、実行できるようにするために「ビルド」が必要なものとがあります。Cなどのコンパイルが必要な言語で書かれたプログラムは当然ビルドが必要ですし、コンパイルが不要な言語であっても、インストーラパッケージを作るというビルド作業が必要な場合はあります。 ビルド作業の自動化のためのツールとしてmakeなどがありますが、そこまで本格的な事をやる必要がない場合は、シェルスクリプトで「ビルドスクリプト」を作るのが手軽でおすすめです。この記事では、そのような場合に役立つシェルスクリプトのテクニックを4つご紹介します。 エラーの気付きやすさとデバッグのしやすさを高める メッセージに色を付ける シェル関数をライブラリにする 一時的に作業ディレクトリの中に入る エラーの気付きやすさとデバッグのしやすさを高める はじめに紹介するテクニックは問題が発生した時に気づきや
2024-06-24 DomainObjectからValueObjectを自動生成するOSS作ってみた ~ ts-vo-generator~
bashでちょっと高度なシェルスクリプトを書くときに役立ちそうな小技をまとめてみました. && と || を積極的に使う bashでは コマンド1 && コマンド2 と記述すると,コマンド1が成功した場合のみ,コマンド2が実行されるようになります. (コマンド1が失敗すると,コマンド2は無視されます.) "||"は"&&"の逆で コマンド1 || コマンド2 と記述すると,コマンド1が失敗した場合のみ,コマンド2が実行されるようになります. (コマンド1が成功すると,コマンド2は無視されます.) これがなんの役に立つのか?まだピンとこない人は,次の errorとabortの例をみてください. エラー処理は error関数と abort関数を使う エラー処理は error関数と abort関数を作ると作業が捗ります. エラーメッセージを出す関数: error function error {
$ cat foo.sh #!/bin/sh elems[0]=0 elems[1]=1 for x in ${elems[*]}; do echo $x done $ ./checkbashisms foo.sh possible bashism in foo.sh line 3 (bash arrays, H[0]): elems[0]=0 possible bashism in foo.sh line 4 (bash arrays, H[0]): elems[1]=1 possible bashism in foo.sh line 5 (bash arrays, ${name[0|*|@]}): for x in ${elems[*]}; do
この記事は、Mackerel Advent Calendar 2015 8日目の記事です。 Mackerel に登録しているホストに ssh するとき、 補完できたら楽かもしれないと思い、その実現方法を模索してみました。 補完機能を一から書くのは大変なので、 bash-completion を使います。 動作環境は Linux です。 ※紹介する方法は、ローカルマシンからの ssh で補完する方法ではなく、 リモートマシンからリモートマシンへ ssh する際に補完する方法です。 bash-completion bash-completion は、bash の補完機能を拡張するものです。 細かく説明されている記事がいくつもあると思いますので説明は省きます。 以下のようにインストールできます。 yum yum install -y epel-release yum install -y --e
備忘録を兼ねて、ブログを書いておきます。 きっかけは、昨日のはてブでホットエントリに上がっていた下の記事です。 元記事から、GitHub のソースコードにたどりついて、少しだけ内部のコードを読みました。 https://github.com/niieani/bash-oo-framework どうも、Pure Bash で書かれているようですね。 OO という名前が現すように、オブジェクト指向で書けるように型システムをも実装しているようです。と、これは記事でも紹介されていましたが。 さて、この記事を読む数カ月前に、私は Bash on Rails なるものを作っていた人を知ったので、それを想起しました。 Bash on Rails は @emasaka さんが作った Rails モドキで、「Bash の機能だけでいかに Ruby on Rails っぽいことができるか」を実践したパロディ企
B! 26 0 1 0 BashのTabを押した時に出る補完の自作等について。 Bash補完 complete 補完補助関数 COMPREPLY compgen COMP_WORDS, COMP_CWORD Bash-Completion MacのHomebrewでBash補完のファイルをインストールするFormulaを作る Bash補完 complete Bashであるコマンドに対して補完を出来るようにしてあげるには complete -F _comp_func cmd とcompleteコマンドを使います。 これでcmdというコマンドに対する補完を_comp_funcという関数で与えます。 -Fで関数を指定。 この_comp_funcという関数は別で定義しないといけませんが、 この関数は通常ダイレクトに使われてほしくないもの(使っても意味無いもの) なので_を最初に付けたりして通常のコ
シェルスクリプトで引数の処理をしたい場合は、getopts が便利ですね。 使い方を忘れてしまいがちで、かつ、決まった形式で使うことが多いので、メモついでに雛型を作っておきます。 雛型 #!/bin/sh # # 20111207 # getopts test # PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/sbin:/usr/sbin export PATH # # usage # _usage() { #(*1) echo "usage:" echo "${0} -a -b HOGE [-c] [-d FOO] [BAR]" exit 1 } # # getopts # while getopts :ab:cd: OPT; do #(*2) case ${OPT} in a) ENABLE_a="t";; b) ENABLE_b
シェルスクリプトで引数オプションを使いたい my_shell_script -a /usr/bin みたいに、bashのシェルスクリプトでも引数を扱いたい。 getopts を使えば引数が取れる bash では getopts を使えば、引数の処理を簡単に行うことができて便利。ruby などでは optparseに相当するやつです。 はじめに getopt / getopts の違いについて 全ての初めに。 getoptsについて読む前に知っておかなくちゃいけないことがある。 getopts コマンドとシェルのビルトインの二種類がある。 名前 種類 getopts シェル組み込み getopt コマンド・ファイル Google検索はgetopt/getopts を区別しないで結果を出すので注意が必要でした。 今回、調べたのは getopts です。 getopt は/usr/bin にある
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く