タグ

ShellScriptに関するmasutaka26のブックマーク (38)

  • シェルスクリプトの [ は /bin/[ と言ったり [ "x$var" = "xval" ] と書く人はオジサン - Qiita

    # Ubuntu 20.04 の bash での実行結果 # シェルから [ が何として見えているか $ type [ [ is a shell builtin # PATH から見つかる全ての [ コマンドを出力する # 補足 zsh では which がシェルビルトインコマンドで、シェルビルトイン版の [ も出力される $ which -a [ /usr/bin/[ /bin/[ $ type [[ [[ is a shell keyword # zsh では [[ をパターンとして認識してしまうのでダブルクォートが必要 $ type "[[" [[ is a reserved word ちなみに [ の外部コマンド版が /usr/bin/ と /bin/ の両方にあるのは Ubuntu 20.04 では /bin が /usr/bin へのシンボリックリンクになっているからです。Ub

    シェルスクリプトの [ は /bin/[ と言ったり [ "x$var" = "xval" ] と書く人はオジサン - Qiita
    masutaka26
    masutaka26 2021/09/01
    昔 [ "x$var" = "xval" ] を使ったシェルスクリプトを見たことがあり、理由もその時知ったけど、さすがに賛同できなくて使わなかった思い出。あとは野となれ山となれ的な。-a と -o はバリバリ使ってた。マジか
  • シェルスクリプトを書くときにいつもやるやつを調べた

    bash のシェルスクリプトを書くときに、いつも脳死で以下をやっている。(同僚が整備してくれたものをコピペしている) エディタなり CI で shellcheck をまわす set -euxo pipefail と冒頭に書く こんな感じ #!/bin/bash set -euxo pipefail いつまでもコピペではさすがにアレなので、意味を調べたメモ。 shellcheck koalaman/shellcheck: ShellCheck, a static analysis tool for shell scripts イケてない書き方に警告を出してくれる それぞれの警告にはエラーコード割り振られていてとても便利 エラーコードごとに正誤例、解説が書かれているのでわかりやすい SC1000 の例 CI もそうだし、エディタのプラグインも充実 しているのでとりあえず入れておくと良い set

    シェルスクリプトを書くときにいつもやるやつを調べた
    masutaka26
    masutaka26 2021/02/18
    pipefail は CircleCI の run のログで知った。-x 以外は設定されて実行されるよ
  • sh -cで呼び出したコマンドがbashだと孫プロセスにならないことがある | おそらくはそれさえも平凡な日々

    前提として、/bin/sh は、デフォルトでは、RHEL系の場合bashシェル、Debian系の場合dashシェルへのsymlinkになっています。この2つのシェルの挙動は細かいところで結構異なります。そもそもの思想として、dashシェルはPOSIX互換を目指す軽量なシェルであり、bashは拡張された高機能なシェル。なのでbash前提で書かれたシェルスクリプトがdashでは動かない、みたいなことはよくあります。そういう感じで困ることがままありますが今回もそういう話。 例えば % sh -c "sleep 100" のようなコマンドを実行した場合、呼び出し元の子プロセスが sh になり、その更に子プロセスが sleep になると直感的には思うでしょう。つまり以下のような具合。 . \_ sh -c sleep 100 \_ sleep 100 しかし、 sh の実体が bash である場合な

    sh -cで呼び出したコマンドがbashだと孫プロセスにならないことがある | おそらくはそれさえも平凡な日々
    masutaka26
    masutaka26 2018/12/20
    sh を bash で置き換えるの好きじゃない
  • シェルスクリプトとMakefileの使い分け - ククログ(2012-10-24)

    先日紹介したシェルスクリプトで「ビルドスクリプト」を作る時に便利なテクニックへのコメントとして「なぜMakefileでやらないのか」「Makefileの方がいいのではないか」といったものがありました。確かにmakeはメジャーなビルドツールなので、そのような疑問が出てくるのも当然でしょう。 なぜシェルスクリプトなのかということの理由はいくつかあります。 1つは、先のエントリの題材としたスクリプトが元々はWindows用のバッチファイルをLinuxのシェルスクリプトに移植したものだったからという理由です。Windowsのバッチファイルのベタ移植として作成したシェルスクリプトを継続的にメンテナンスしてきた間の改良の結果として、いくつかのテクニックが盛り込まれるようになったため、そのテクニックにスポットを当てて紹介しようというのが、先のエントリの発端でした。 もう1つは、シェルスクリプトは「シェル

    シェルスクリプトとMakefileの使い分け - ククログ(2012-10-24)
  • ShellCheck – shell script analysis tool

    GPLv3: free as in freedom documented on the ShellCheck Wiki available on GitHub (as is this website) already packaged for your distro or package manager supported as an integrated linter in major editors available in CodeClimate, Codacy and CodeFactor to auto-check your GitHub repo written in Haskell, if you're into that sort of thing.

    masutaka26
    masutaka26 2017/08/22
    Shell の構文チェックが出来るサイト。shebang が /bin/sh なのに bash 構文を書いたりすると怒ってくれる。brew install shellcheck でローカルでも実行可能。
  • コマンドラインツールを書くなら知っておきたい Bash の 予約済み Exit Code - Qiita

    上記の表の通り,Exit Code 1, 2, 126〜165, 255 は特別な意味を持ち,スクリプトやプログラム内で exit に指定するパラメータとしては避けるべきである.とりわけ,Exit Code 127 はトラブルシューティングで混乱の元である("command not found" で終了したのか,プログラム固有のエラーなのか区別できなくなる).しかしながら,多くのスクリプトが exit 1 を一般的な実行を続行できないエラーとして使っている.Exit Code 1 は Bash の一般的なエラーを含め,とても多くのエラーで発生しうるので,デバッグの時に切り分けが大変になるだろう. Exit Code を体系立てて定義する試みはある(/usr/include/sysexits.h)が,これは C と C++ プログラマー向けである.スクリプトに関しても同様な感じにするのが適切

    コマンドラインツールを書くなら知っておきたい Bash の 予約済み Exit Code - Qiita
    masutaka26
    masutaka26 2016/10/23
    これは良い。けど、受け取った側がそこまで見なさそう。
  • Shell Command Language

    The Open Group Base Specifications Issue 7, 2018 edition IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008) Copyright © 2001-2018 IEEE and The Open Group 2. Shell Command Language This chapter contains the definition of the Shell Command Language. 2.1 Shell Introduction The shell is a command language interpreter. This chapter describes the syntax of that command language as it is used by the

    masutaka26
    masutaka26 2016/07/07
    POSIX の一次ソース。調査用。覚える気はない。${parameter:-word} とか ${parameter:=word} も載っている。
  • シェルスクリプトの処理境界が鮮明になる「名前付きブロック記法」なるものを考えてみた

    シェルスクリプトは長くなると処理の境界が不鮮明になりがち。 コメントで処理の境界を表現する工夫はよく見かけるが、もっと良い方法はないか考えてみた。 :コマンド、&&演算子、複合コマンド()や{}を組み合わせて書くと、処理の境界線がはっきりする。

    シェルスクリプトの処理境界が鮮明になる「名前付きブロック記法」なるものを考えてみた
    masutaka26
    masutaka26 2016/03/29
    シェルスクリプトはただでさえ読みにくく、誰が書いたか分からないものを読むことも多いので、名前付きブロック記法を使って良いかはチームで話す必要がありそう。
  • 何もしない組み込みコマンド ":" (コロン)の使い道

    Bash でシェルスクリプトを勉強していくと出会うのが : (コロン)という名前の組み込みコマンド。このコマンドは何もしないコマンドです。 こんなコマンドの存在は不思議だなと思う反面、C言語にも void という型があったり(関数のような形で存在するのは JavaScript とかですね)、LaTeX にも \relax があったり、何もしない命令というものは機械語の NOP からある普通のものです。 この Bash の : の使い道についてまとめてみました。 何か書かなければならないところに仮置きする 例えば「ここに制御構造を置くんだけど、この節に入るものは後で書くんだけどな〜」といった場合、制御構造の節の中に何も書かないと Bash は構文エラーとなります。 #!/bin/bash arg="$1" if [ -z "$arg" ] ; then echo "デフォルトモード開始" e

    何もしない組み込みコマンド ":" (コロン)の使い道
    masutaka26
    masutaka26 2016/02/13
    問題は可読性。true コマンド使えたらそうしちゃうなー
  • シェルスクリプトの中で1行ずつ変数を分割する際には、cutとかawkとか余計なプロセスを起動せずsetを使って分割した方が効率的 - 双六工場日誌

    シェルスクリプトの中で、スペース区切りもしくはタブ区切りのレコードを扱うことがよくあると思います。 たとえば、前回のエントリ「AWS CLIとjqを使って、AWSのELBボリュームがアタッチされているEC2インスタンス名を出力するワンライナーを書いた - 双六工場日誌」のスクリプトの出力は以下のようになります。 i-ec56a9f5 vol-07d00601 servername i-ec56a9f5 vol-8f550991 servername このようなレコードの特定の列を取り出して、処理する際にどうするのが効率的か、というのがこのエントリのお題です。 非常に古い話題なので、昔からシェルスクリプトを書いている人には自明な話ではありますが、最近、シェルの標準機能の話を聞く機会がなく、失われつつある技術になってきている気がしているので、改めて確認ということで。 例として挙げたレコードから

    シェルスクリプトの中で1行ずつ変数を分割する際には、cutとかawkとか余計なプロセスを起動せずsetを使って分割した方が効率的 - 双六工場日誌
  • sudo してコマンドを実行するシェルスクリプトの書き方 - わからん

    toolbelt.heroku.com の heroku コマンドインストールスクリプト が、sudo してコマンドを実行するシェルスクリプトの書き方の参考になりました。 # https://toolbelt.heroku.com/install-ubuntu.sh echo "This script requires superuser access to install apt packages." echo "You will be prompted for your password by sudo." # clear any previous sudo permission sudo -k # run inside sudo sudo sh <<SCRIPT # add heroku repository to apt echo "deb http://toolbelt.hero

  • sparkで手間を掛けずにデータをビジュアライズする - komagataのブログ

    ボス「ヘイ、ボブ。このあいだやったコメント投稿のログイン必須化の影響がどのぐらいあるかわかるかい?いや、手間がかかるならいいんだが。」 ボブ「お安いご用さ。ワンミニッツ待ってくれ。」 ボブ「上が日別の投稿数で下がコメント数のグラフさ。どうやらコメントにログインを必須にしたことでコメントは減っているけど話の投稿自体は増えているようだね。」 ボス「オー、ボブ、仕事が速いな!次のボーナスは期待してくれよ?」 ボス&ボブ「HAHAHAHAHA!」

    masutaka26
    masutaka26 2012/12/21
    試したけどすげー!! sparkは http://github.com/holman/spark にあるBash Script!!
  • Mitzyuki's Blog :: シェルスクリプトで便利な小技

    シェルスクリプトで便利な小技 シェルスクリプトを作成するときに知っておくと便利な小技集。 exec > ファイル 以降の標準出力を全て ファイル に出力するので この設定をしておくと簡単な実行ログが取得出来る。 同様に exec 2> ファイル とすると 標準エラー出力が全て ファイル に出力されるので エラーログが取得できる。 当然 exec > ファイル 2>&1 とすれば 標準出力も標準エラー出力も取得できる。 ファイル に /dev/null を指定すれば スクリプト実行中の出力は全て抑止されるので、 cron (8) から実行される場合などでは便利な場合もある。 1#!/bin/sh 2 3exec 2> ${TMP:-/tmp}/myname.log 4 : set -e スクリプト実行時に制御文以外でエラーが発生した場合に スクリプトを終了させる。 スクリプト中で実行すべきコ

    masutaka26
    masutaka26 2012/07/29
    ありがとうございます。
  • shell script を書くときの tips 2つ(初心者向け) - tokuhirom's blog

    shell script は普段さけて通りたいと願ってやまないわけですが、たまには書かないといけないことがあるので、そういうときは覚えておくと便利な tips を2つ。 autodie っぽくするset -eとすると、コマンドの実行に失敗したときにそこで実行がとまるので便利。 #!/bin/sh set -e perl -e 'die' echo SHOULD NOT REACH HEREとすると % ./hoge.sh Died at -e line 1. % echo $? 255となって、最後までいかずに死にます。 複数のコマンドを順番に実行するときに便利。 なお、以下のような挙動をするんだそうです。 ただし失敗したコマンドが until または while ループの一部である、 if 文の一部である、 && または || リストの一部である、 コマンドの返り値が ! で反転されてい

    masutaka26
    masutaka26 2012/07/27
    set -e は知らなかった。
  • シェルスクリプトを多重起動しないようにする - 西尾泰和のはてなダイアリー

    最初はこう書いていた。 lockfile build.lock ... rm -f build.lockだけど、lockfileは失敗した時にデフォルトでは無限にリトライをする。ちょっと出来心で$ for i in {1..100}; do ./foo.sh; done;したから100人の待ち行列が出来てしまった。 やりたかったことは「既に起動していたら続行しないで終了」だったので-r 0でリトライ回数を0にした。 lockfile -r 0 build.lock || exit 1 ... rm -f build.lock

    シェルスクリプトを多重起動しないようにする - 西尾泰和のはてなダイアリー
  • シェルスクリプトを書く際に気を付けていること8箇条 - カイワレの大冒険 Third

    エンジニアという職業柄かシェルスクリプトを書くことはちょくちょくあるのですが、自分なりに気を付けていることを備忘録&自分への戒めも含めて、簡単に書いてみたいと思います。 変数は大文字 シェルスクリプト書いていれば変数の出番は至るところであるでしょう。その際、可読性を増すように、変数は大文字を使っています。 RET=`cmd1`みたいに。好みの問題もあるでしょうが、分かりやすいので。 クオテーションは選ぶ クオテーションにはシングルだったり、ダブルだったり色々ありますが、使い分けておいたほうがよいでしょう。 変数の展開がないようであれば、シングルクオーテーションのほうがスマートでしょうし、展開があるのならダブルクオーテーションを使えばと。 ダブルクオーテーションを使うのにも意味があって、変数は「$RET」のようにクオテーションで囲まなくても動作はたいていするのですが、 echo "${RET

    シェルスクリプトを書く際に気を付けていること8箇条 - カイワレの大冒険 Third
  • Omicron bash/builtin

    組込みコマンド(builtin)は,通常の(外部)コマンドと違って,プロセスを fork & exec せずに,シェルのプロセス内部で実行される.なので,速いという利点もあるが,もし cd や export (csh なら setenv),ulimit などが外部コマンドとして実装されていたら,プロセスが終了した時点で,変更の影響が消えてしまう(例えば,cd でカレントディレクトリを移動しても,cd が終了して,シェルに戻ったら元の木阿弥).つまり,これらのコマンドは組込みコマンドとして実装する必要がある.質的にはこちらの方が重要である. 移植性の高いシェルスクリプトを書くには,bash の builtin の振舞いについても頭に入れておいた方がいいだろう. コマンドが builtin であるかを調べるには,bash は type,tcsh は which を使う.この場合の type,

    masutaka26
    masutaka26 2012/01/24
    cd が組み込みコマンドな理由
  • ログイン - yanor.net/wiki

    masutaka26
    masutaka26 2012/01/08
    インタラクティブシェルかどうかを tty -s で判断するのか。へぇ〜
  • ログイン - yanor.net/wiki

    masutaka26
    masutaka26 2012/01/08
    CSV ファイルの読み込みのところ、IFS=, が面白い。
  • hansode.org - このウェブサイトは販売用です! - hansode リソースおよび情報

    このウェブサイトは販売用です! hansode.org は、あなたがお探しの情報の全ての最新かつ最適なソースです。一般トピックからここから検索できる内容は、hansode.orgが全てとなります。あなたがお探しの内容が見つかることを願っています!