タグ

shellscriptに関するissmのブックマーク (45)

  • 続・ラフなラボ – シェルスクリプトが '> $logfile 2>&1' だらけにならなくて済んだ話

    ※ 2014-04-26 追記並びに一部コマンド部分の修正を行いました。( > => >> に変更 ) 個人用のチラシの裏のつもりが予想以上に反響いただいていたようで非常にびっくりしております。 ちょっとしたバッチ処理的なものはさくっとシェルスクリプトでやっています。 で、ログをとっておくべくリダイレクトを噛ますわけですが、 スマートに書く方法を調べたのでメモ。 元ネタは @sechiro さんの bashのプロセス置換機能を活用して、シェル作業やスクリプト書きを効率化する でございます。 当に参考になりました。ありがとうございます。 今までは こんなことやってたわけです。 #!/bin/bash LOGFILE=/tmp/script-log command1 >> $LOGFILE 2>&1 command2 >> $LOGFILE 2>&1 ... >> $LOGFILE 2>&1

  • BashのTips

    ログインシェルの場合(e.g. 直接ログイン、sshログイン時、bash --login、su -) $HOME/.bash_profile が読み込まれる。 上記がない場合、$HOME/.bash_login が読み込まれる。 上記がない場合、$HOME/.profile が読み込まれる。 上記から $HOME/.bashrc が読み込まれることが多い。 非ログインシェルかつ対話モード(e.g. 入出力が端末)の場合 $HOME/.bashrc が読み込まれる。

  • xargsにbashのfunctionを渡す方法 - (wrist blog)

    あっさりできるかと思ったら意外に時間が掛かってしまったので纏めておく。 ポイントは2点で、 export -f 関数名 しておく xargsではbash -c "コマンド" を実行する で行けた。 例 パスにそのbasenameした結果をTAB区切りで連結しただけの文字列をechoする関数を定義する。 $ function echo_with_basename(){ > echo -e "$1\t`basename $1`" # -eオプションが無いと\tがTABに変換されない > }この関数を次のようにファイルリストを出力した結果をパイプで繋ぎxargsに渡す。 $ cat filelist.txt /home/wrist/data/A00000.txt /home/wrist/data/A00001.txt /home/wrist/data/A00002.txt /home/wrist

    xargsにbashのfunctionを渡す方法 - (wrist blog)
  • rbenvの切り替えの仕組み…と、他言語での実験 - すぎゃーんメモ

    rbenvを使ってみる - すぎゃーんメモの続き。 現時点でのrbenvのバージョンは0.2.1。 rbenvを使っていると.rbenv-versionファイルの有無でrubyコマンド打ったときに実行されるrubyが違うものになる、というのがちょっと新鮮で、これはどういう仕組みで動いているのだろう?と思って少し調べてみた。 上記記事のようにrbenvの設定をした環境では、 $ which ruby /Users/sugyan/.rbenv/shims/rubyとなり、${RBENV_ROOT}/shims以下のrubyを指すことになる。ここへのPATHは$HOME/.rbenv/libexec/rbenv-initに echo 'export PATH="'${RBENV_ROOT}'/shims:${PATH}"' と書かれているので、eval "$(rbenv init -)"してあれ

    rbenvの切り替えの仕組み…と、他言語での実験 - すぎゃーんメモ
  • シェルスクリプトを書くときはset -euしておく - Qiita

    を書いておく。以下解説。 set -e エラーがあったらシェルスクリプトをそこで打ち止めにしてくれる(exit 0以外が返るものがあったら止まるようになる)。「あっあれここでうまくいってないからデータ準備できてないのにあれあれっもうやめて!」ってなるのを防げる。 set -u 未定義の変数を使おうとしたときに打ち止めにしてくれる。Perlでいうuse strict 'vars';的なもの。 って気軽な気持ちで書いてしまって、「ん、やたら時間かかると思ったらスペルミスうわなにをするやめ」ってなるのを防げる。 一部だけ例外にしたい はてなブックマークのコメントより -e は command1 || command2 みたいなことが出来なくなるの使うことないな。-uは付けといて良いが。 確かにおっしゃるとおりですね。コマンドの失敗を考慮して書いている部分については(もしくはやたらexit 0以外

    シェルスクリプトを書くときはset -euしておく - Qiita
  • 何もしない組み込みコマンド ":" (コロン)の使い道

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

    何もしない組み込みコマンド ":" (コロン)の使い道
  • init.d スクリプトを書こう

    私が 1997 年頃に Slackware から Debian にやって来たとき、 悩んだことのひとつが起動スクリプトでした。 Slackware では rc.local というファイルに起動コマンド列を べた書きすればよかったのですが、 Debian では start, stop, restart などの引き数をとって、 ひとつのスクリプトで起動・停止・設定変更などを行います。 このため走っているデーモンプロセスを捕まえるために start-stop-daemon という独自コマンドが多用されることになりますが、 これは使い方に多少のコツがあります。 この文書では、これまでに自前の起動スクリプトを書いた経験から、 そのへんのポイントをいくつか書いておこうと思います。 ただまあ、 シャットダウンに気を使わなくていい いざとなったらスーパーユーザ権限でモゲればいい という場合も結構多いと思う

  • おそらくはそれさえも平凡な日々: サーバーマシンのコア数に応じてworker数を調整する方法

    PSGI/Plackアプリケーションの起動方法いろいろと番環境アレコレ 便乗ポスト。最近は、上記内の「シェルスクリプトでラップする方法」で運用していることが多いです。その場合のone more tips. appサーバーごとにマシンスペックが違う場合がたまにあって、その場合マシンごとに worker数を調整したいけど、deployの都合上サーバー起動スクリプトは同じやつを使いた いってことがあります。 そこでおすすめなのが、CPUコア数に応じてworker数を計算する方法です。 シェルスクリプトの場合、 % cat app.sh #/bin/sh NCPU=`getconf _NPROCESSORS_ONLN` WORKERS=$(expr $NCPU \* 5) exec plackup -E production -s Starlet --max-workers=$WORKERS と

  • tmuxのcolor一覧について : まがりの日記

  • シェルスクリプトで外部コマンドを利用する場合の注意点 · さよならインターネット

    November 10, 2014 TL;DR シェルスクリプトでbackquoteを見つけたら オールドスタイルおじさんを探し、矯正させよう GNU Bash-2.05 manual When the old-style backquote form of substitution is used, backslash retains its lit- eral meaning except when followed by $, `, or \. The first backquote not preceded by a backslash terminates the command substitution. When using the $(command) form, all characters between the parentheses make up the comm

    issm
    issm 2014/11/10
    モダン shellscript
  • シェルスクリプトを公開するとき, コマンド前にバックスラッシュをつけるべき - Shohei Yoshida's Diary

    oh-my-zsh の環境で、peco-select-history が動かない - Qiita 追記 2014年 7月 7日 シェルスクリプトと書いてしまい漠然すぎましたが, ここで述べている ことが問題になるのは, .bashrc, .zshrcに関数, alias設定等がコピー される場合や, sourceコマンドでファイルを読み込む場合です. non-interactiveに実行されるシェルスクリプトについては特に 問題ないです. 問題点 そうしないと, 公開されたコマンドを自分の環境に導入した場合, aliasにより正しく動かなく場合があるためです. aliasをつけがちな コマンド(ls, grep等)がシェルスクリプトに含まれていると 特に問題が起こる可能性が高くなります. 例 pecoを使って カレントディレクトリのファイルをページャで開く 例を考えてみましょう. 単純に考

    シェルスクリプトを公開するとき, コマンド前にバックスラッシュをつけるべき - Shohei Yoshida's Diary
    issm
    issm 2014/07/03
    "自分で書いて自分しか使わないケースだと別にどうでもいいと思うのですが, 他の人が使うような場合は aliasを無視するようにバックスラッシュをつけるべきでしょう."
  • Talpa memorandum

    橘玲の『「読まなくてもいい」の読書案内』を読んだので、感想とメモをまとめておく。 この、タイトルは『「読まなくてもいい」の読書案内』だが、実際には「読まなくていい」はほとんど紹介されていない。紹介されているのは、当たり前の話かもしれないが読むべきだ。他の読書案内と異なっているのは、”こういうは読まなくて良い”と、ばっさり切り捨てているところ。読むべきか・読まなくてもよいかの基準は、20世紀後半に爆発的に進歩した科学研究の成果に置いている。著者は、この時期に起きた科学研究の大幅な進歩を”知のビッグバン”、”知のパラダイム転換”と呼び、これ以前に書かれたは(とりあえず)読む必要がないと言い切る。古いパラダイムで書かれたは捨てて、新しいパラダイムで書かれたを読もうという話だ。ちょっと乱暴な分け方ではあるが、1980年代に大学生だった私には案外納得できるものだった。学生時代に最

  • 使いやすいシェルスクリプトを書く

    できればシェルスクリプトなんて書きたくないんだけど,まだまだ書く機会は多い.シェル芸やワンライナーのような凝ったことではなく,他のひとが使いやすいシェルスクリプトを書くために自分が実践していることをまとめておく. ヘルプメッセージ 書いてるシェルスクリプトが使い捨てではなく何度も使うものである場合は,体を書き始める前に,そのスクリプトの使い方を表示するusage関数を書いてしまう. これを書いておくと,後々チームへ共有がしやすくなる.とりあえずusage見てくださいと言える.また,あらかじめ書くことで,単なるシェルスクリプトであっても自分の中で動作を整理してから書き始めることができる.関数として書くのは,usageを表示してあげるとよい場面がいくつかあり,使い回すことができるため. 以下のように書く. function usage { cat <<EOF $(basename ${0})

  • 名前の一部からコマンドを検索してくれちゃうwhich2 | J7LG

    便利かも which2 () {   [ -z “$1” ] && return   find ${PATH//:/ } -maxdepth 1 -iwholename “*${1}*” -not -type d } ~/.bashrcに追加して $ source ~/.bashrc して使う

  • シグナルと trap コマンド | UNIX & Linux コマンド・シェルスクリプト リファレンス

    シグナルと trap コマンド シグナル シグナルとは? シグナルとは、実行中のプロセスに対して、さまざまなイベントを通知するために送出されるものである。 よく使用される、プロセスを終了するためのシグナルである SIGTERM や SIGKILL などのほかにも、数十種類のシグナルが存在する。 使用可能なシグナルの一覧は、コマンドラインから kill -l を実行することで参照可能である。 $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19)

    シグナルと trap コマンド | UNIX & Linux コマンド・シェルスクリプト リファレンス
  • Mitzyuki's Blog :: POSIX.2 標準仕様のシェルによる変数展開

    デフォルト値への置換 ${parameter:-word} ${parameter} が NULL の場合 word に置換される。 $ echo ${foo} $ echo ${foo:-FOO} FOO $ echo ${foo} $ foo=BAR $ echo ${foo:-FOO} BAR デフォルト値の代入 ${parameter:=word} ${parameter} が NULL の場合 word に置換され、 かつ parameter に代入される。 $ echo ${foo} $ echo ${foo:=FOO} FOO $ echo ${foo} FOO $ echo ${foo:=BAR} FOO 値の検査とエラー ${parameter:?[word]} ${parameter} が NULL の場合 word が指定されていればその値を、 指定されていない場合は

  • 最低限 UNIX / Linux [III] 【シェルスクリプト】

    3. シェルスクリプト さて, vi の使い方を大雑把に理解したところで 今日のメインである シェルスクリプト について学習しましょう. [3.1] シェルスクリプト入門 これまで見てきたように, シェルはユーザとコンピュータの橋渡しをして, ユーザがコマンドを端末から打ち込む毎に, それを解釈し実行します. 一方, [2.0.2]節で触れたように, 「プログラムが可能である」という, もう一つの面もあります. この, プログラムとして手続きを書き込んだファイルを 「スクリプト・ファイル」と言います. スクリプト(script)とは劇の「台」のことであり, 台を事前に決めていてそれに沿って行わせるためにこの名前があります. シェル以外にも多くのスクリプト言語, 例えば Perl, Rubby などがあります. もちろん全部を覚える必要は全くありませんが, 一つでも使いこなせると非常に便

  • シェルスクリプト Tips | UNIX & Linux コマンド・シェルスクリプト リファレンス

    シェルスクリプト Tips コーディング・スタイル ここに書かれている内容は、あくまで筆者の好みでありほぼ完全に主観ではあるが、経験的に行き着いたスタイルでもあるので推奨します。 スクリプトのヘッダを作成する 最近はあまり使用されることもないのかもしれないが @(#) の記述と、スクリプトの使用方法、および概要をファイルの前方にコメントとして記述しておくようにする。 ※ @(#) は what コマンドで参照する情報を記述するための記号です。詳細は「whatコマンドについて」を参照。 #!/bin/bash # # @(#) hoge.sh ver.1.0.0 2008.04.24 # # Usage: # hoge.sh param1 param2 # param1 - パラメータ1です. # param2 - パラメータ2です. # # Description: # hoge.shスク

    シェルスクリプト Tips | UNIX & Linux コマンド・シェルスクリプト リファレンス
  • [ツール]plenvやrbenvを一発でインストールするスクリプト

    タイトルどおりの物をつくったので、晒しておきます。 使い方 plenvの場合 $ curl -L http://is.gd/plenvsetup | bash rbenvの場合 $ curl -L http://is.gd/rbenvsetup | bash 手元でしか動作確認してないですので、おかしなところあったらツッコミください。 2014/04/28 追記 plenvsetupを更新しました。以下の修正が行われています。 zshに対応しました ~/.plenv が存在する時にgit cloneしないようにしました 手動によるprofileの再読み込みを促すようにしました 2014/05/31 追記 実行方法を sh から bash に修正しました。 2014/06/03 追記 後日談をこちらにかきました。ぜひ参考にしていただきたいと思い

  • 複数ホストに ssh しながら tail -F するときにはこうしたらどう? - tokuhirom's blog

    複数ホストに ssh しながら tail -F するときにはこうしたらどう? いろいろ方法があるとおもうのですが、以下のようなシェルスクリプトですませるのはどうでしょうか? #!/bin/bash function kill_children { # jobs -l | perl -ne 'print "kill $1\n" if /^\S+?\s+(\d+)/' | sh; pkill -P $$; wait; } trap "kill_children" EXIT HOSTS="192.168.1.1 192.168.1.2" for host in $HOSTS do ssh $host tail -F /service/foo/log/main/current & done wait ちょっと箇条書きで解説すると以下のようなことをおこなっています。 & でバックグラウンドジョブをは