タグ

ブックマーク / fumiyas.github.io (17)

  • ポータブルなシェルスクリプトを書く - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    拡張 POSIX シェルスクリプト Advent Calendar 2013、19日目の記事です。 うおー、あと 30分で書かないといけねー! 雑な内容ですみません。 今日はポータブルなシェルスクリプトの書き方ついてざっくり語ります。 UNIX 系 OS であれば大抵の OS / バージョンでも動くシェルスクリプト!! (ただし外部コマンドの非互換性の問題は除く) #!/bin/sh で書く POSIX sh でスクリプトを書けば完璧! shebang は #!/bin/sh!! …全然完璧ではありません。Solaris 10 のように /bin/sh が POSIX sh でない残念な OS がまだ生き残っています。 マニュアルにも載っているバグが仕様になったのではないかと思われる謎挙動や未知のバグを回避するのが大変です。 ポータブルにするには #!/bin/sh はまだ推奨できません。

  • コマンド実行でシェルが怖いなら使わなければいいじゃない - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    http://blog.ohgaki.net/os-command-escape-shell-spec-command-implementation 「えすけーぷじゅうよう!!」を強調して言いたいからなのかシェルの理解が足りないからなのか、 意図がよくわからない文言やら説明が散見されますが、きりがないのでそれらはスルーします。 (シェルについては、なんで関係ない tcsh の話が出てくるんだとか、 位置パラメーター展開に $* 使うなとか、色々) 特に気になったのが以下の文章です。(強調は私によるもの) OSコマンドはOSが提供するシェルで実行されます。 シェルはテキストインターフェースを持ち、 テキストでコマンドとオプションを受け取り実行します。 例示した脆弱なPHPプログラムの場合、 ユーザーからの入力に対しセキュリティ処理を一切してないため、 簡単にサーバーを乗っ取られる可能性があり

    mas-higa
    mas-higa 2013/12/24
    "オプションでない引数を渡す場合は、 オプション終端オプション -- 以降に指定することも重要です。" kwsk
  • コマンドパイプラインの終了コード - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    拡張 POSIX シェルスクリプト Advent Calendar 2013、18日目の記事です。 今日も書く暇がなかったので軽く済ませます。すみません。 今日は Twitter で @koie さん からシェルネタを振られたので、 勝手に採用して、もう少し詳しく紹介したいと思います。 コマンドの終了コード 実行したコマンドの終了コードはシェル変数 $? で取得できます。 $ true $ echo $? 0 $ false $ echo $? 1 $ grep 使用法: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information. $ echo $? 2

  • コマンド種別の判定と使い分け - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    拡張 POSIX シェルスクリプト Advent Calendar 2013、17日目の記事です。 時間がないのでやっつけです。間違いがあったらすみません…。 今日はシェルから起動するコマンドが何者かを知る方法と使い分ける方法を紹介します。 コマンドの種類 シェルのコマンドラインから起動されるコマンドの種類として以下の 4つがあります。 (for などの制御構文は除く) シェルのコマンドエイリアス シェルの関数 シェルの組込みコマンド 外部のコマンド ほかにもあったっけ? いまいち自信なし。 エイリアスがコマンドかどうかはさておく。 コマンド種別の判定方法 シェルの種類に依って色々な判定方法があるのですが、 一番ポータブルなのは組込みコマンド type を利用する方法です 旧来の sh でも使えます。 $ alias aliasname='echo foo' $ type aliasnam

    mas-higa
    mas-higa 2013/12/18
    $ type command # => command is a shell builtin
  • test と [ と [[ コマンドの違い - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    test と [ と [[ コマンドの違い - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog 拡張 POSIX シェルスクリプト Advent Calendar 2013、15日目の記事です。 書くのが遅れ、ネタは尽きかけ、 マニアックさやニッチさが足りなくなってきているような気がします。 ふつうの内容ですみません。 今日は test, [, [[ コマンドの違いについてざっくり紹介します。 [[ がある bash, ksh, zsh ならば test と [ の使用は避け、 [[ を使用すべきです。 [ は慎重に使わないと様々な罠にかかるため危険です。 (翌日のネタも併わせてどうぞ) test と [ の違い どちらもシェルの組込みコマンドです。名前が違うのと [ は最後の引数を ] にしなければいけない縛りがある以外、 動作まった

    mas-higa
    mas-higa 2013/12/16
    一方で /usr/bin/test (/usr/bin/[) があるのも事実。
  • read コマンドの使い方 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    拡張 POSIX シェルスクリプト Advent Calendar 2013、13日目の記事です。 今日のネタは組込みコマンド read の解説と使い方を紹介します。 read コマンドとは? read の基仕様・動作は次の通りです。 シェルの組込みコマンドである。 標準入力を読み、一行読み込むか EOF になると終了する。 終了コードは、行を読み込めたときは 0、 読み込めなかったとき (EOF も含む) は 1 となる。 引数にシェル変数名が指定されていたら読み込んだ行を変数に格納する。 読み込んだ行の末尾に改行が付いていたら削除した値となる。 引数のシェル変数名が複数指定されていたら区切り文字 (デフォルトはスペースとタブ。シェル変数 $IFS の値) で分割して変数に格納する。 入力の区切り文字はバックスラッシュ \ で分割をエスケープすることができる。 代表的なオプションは次の

    mas-higa
    mas-higa 2013/12/16
    "while と組み合せて使用したときに、 最後の入力の処理が抜け落ちてしまう可能性"
  • 日本語対応 wdiff で単語ごとの差分表示 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    語対応 wdiff で単語ごとの差分表示 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog Doc-ja Advent Calendar 2013 兼 拡張 POSIX シェルスクリプト Advent Calendar 2013、12日目の記事です。 今日は翻訳作業に役立つツールを 2つ紹介します。 単語ごとの差分を表示する wdiff コマンドと、 その日語対応版 jwdiff コマンドです。 wdiff の紹介 wdiff はテキストデータの差分を単語ごとに示してくれるツールです。 一般的によく利用されるテキストデータ差分表示ツールである diff は、 行ごとに差分を表示します。 $ diff -u en.txt.old en.txt --- en.txt.old 2013-12-12 02:16:42.309525648

    日本語対応 wdiff で単語ごとの差分表示 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog
  • FizzBuzz.sh - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    拡張 POSIX シェルスクリプト Advent Calendar 2013、13日目の記事です。 ようやく折り返し地点まできました。もう疲れました。 日は FizzBuzz をお楽しみください。 一応コードゴルフ頑張ってます。もっと短いのをご存知でしたら教えてください。 ところで、12月25日はクリスマスな上に、 OSS 界隈で地味に活躍されているふみやすさんの誕生日ですね! っ http://www.amazon.co.jp/registry/wishlist/27M7TV8CEEF6G?sort=priority 逆に、あなたの書いた OSS や Blog や Advent Calendar が気に入ったら何か送りたく なってしまうかもしれないので、プロフィールや Web サイトに あなたの Amazon 欲しいものリストの URL を貼っておいてくださいね! 私が勤める OSST

  • ksh でパイプライン後に exec するとゾンビができる - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    ksh でパイプライン後に exec するとゾンビができる - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog 拡張 POSIX シェルスクリプト Advent Calendar 2013、11日目の記事です。 Twitter で読者が少ないようだと零したところ、 「ネタがマニアックすぎでは」と言われました。そうですか、そうですね。 今日のネタはさらにマニアックかつマイナーな ksh 限定の話題で、 さらに下を行きたいと思います! ゾンビ出現! 数年前、仕事で自社ソフトウェアパッケージを AIX 対応しました。 モノは何かというと Samba です。 それまでは Red Hat Enterprise Linux 版と Solaris 版を用意していたのですが、 新たに AIX 版を作ることになったのです。 IBM POWER EXPRE

    mas-higa
    mas-higa 2013/12/12
  • パイプラインとサブシェルの問題はシェル依存 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    パイプラインとサブシェルの問題はシェル依存 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog 拡張 POSIX シェルスクリプト Advent Calendar 2013、10日目の記事です。 そろそろネタが尽きそうです。 スクリプトの添削依頼や疑問・質問、やって欲しいネタをお待ちしております。 記事に反映できるかどうかは内容や私の実力次第ですが…。 今日はコマンドパイプラインを実行したときの変数のスコープの問題について紹介します。 「あー、パイプラインとサブシェルの問題だね。知っているよ!」という方も、 最後までお付き合いいただけると新しい発見があるかもしれません。 まずシェルスクリプトのお題として 「メンバー情報が空でないグループの数とグループ名の一覧をカンマ区切りで表示するスクリプトの作成」 を考えてみます。 実装のポイントは次

  • echo コマンドの違いと移植性の問題 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    echo コマンドの違いと移植性の問題 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog 拡張 POSIX シェルスクリプト Advent Calendar 2013、8日目の記事です。 今日はシェルや OS ごとに微妙に異なる echo コマンドの違いを紹介します。 echo コマンドの挙動は大きく分けて 2種類あります。 BSD 系 echo コマンドの挙動 引数に指定された文字列をそのまま出力します。 複数の文字列が指定された場合はスペース (0x20) 一文字で区切られます。 最後に改行を出力しますが、最初の引数が -n のときはオプションとして認識し、 最後の改行を出力しません。 $ echo foo foo $ echo foo bar foo bar $ echo 'foo\nbar' foo\nbar $ echo f

    mas-higa
    mas-higa 2013/12/10
    "知らない子ですね"
  • 安全な一時ファイルの作成と削除の方法 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    拡張 POSIX シェルスクリプト Advent Calendar 2013、6日目の記事です。 日のお題は「一時ファイルの作成と削除」ですが、 よくあるシェルスクリプトのダメ出しネタになってしまいました。 安全な一時ファイルの作成方法 たとえば、こんな感じのありがち(?)なスクリプトがあったとします。 意味のない処理内容ですが、雰囲気だけ察してください。 #!/bin/bash tmpfile=/tmp/words.tmp rm -f $tmpfile echo 'しにたい' >>$tmpfile echo 'とりあえずねよう' >>$tmpfile sleep 3 echo -n '今どんな気持ち? ' read feeling echo $feeling >>$tmpfile cat $tmpfile rm $tmpfile 全然駄目ですね。 もし「何にも問題ないじゃないか!」とい

  • スクリプト終了イベントの捕捉と zsh の非互換性 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    スクリプト終了イベントの捕捉と zsh の非互換性 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog 拡張 POSIX シェルスクリプト Advent Calendar 2013、5日目の記事です。 書いているうちにネタが変わってしまいました。 trap というシェル組込みコマンドをご存じですか? シグナルを受信したときに実行する処理 (シグナルハンドラー) を設定するものです。 例えば SIGINT シグナル※を受信するとデフォルトではスクリプトが終了しますが、 trap で捕まえてやると終了せずに継続することも可能です。 (※割り込み (INTerrupt)。 端末から実行したシェルスクリプトなら Ctrl+c で送信可) $ sh -c 'trap "echo Boo!" INT; while :; do read i && e

  • シェルの種類とバージョンの検出 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    拡張 POSIX シェルスクリプト Advent Calendar 2013、4日目の記事です。 毎日何時間も執筆に時間をとられて大変です。書くの遅いんです。 今日は軽めに、予定を変更してお届けします。 スクリプトがどのシェルインタープリターで動いているかを判定したいときってありませんか? 私はあります。ポータブルなシェルスクリプトを書きたい、 しかし、互換性の問題などでシェルの種類に依存するコードを書き分けないといけない場合です。 ざっくりとシェルの種類、バージョン、 動作モードを判定するスクリプトを作ってみました: sh-detect-name-ver-mode.sh bash は $BASH_VERSION、zsh は $ZSH_VERSION というシェル変数にバージョン文字列が入るため、これで種類の判定ができます。 ちなみに $VAR でなく ${VAR-} としているのは、 s

  • zsh でシェルスクリプトを書くときの留意点 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    拡張 POSIX シェルスクリプト Advent Calendar 2013、3日目の記事です。 初日に「bash を避けて ksh や zsh で書くとスクリプトが速くなるよ!」 と紹介しましたが、実は zsh でふつうの sh なシェルスクリプトを書くと、色々ハマれます。 何が問題でどうすればいいのでしょうか。 いきなりですが、最初にどうすればいいかを紹介します。 スクリプトの先頭を以下のように書くだけです。 zsh は sh, ksh, csh (誰が使うの?) のエミュレーション機能を持っていて、 それを切り替えるのが組込みコマンド emulate です。 -R オプションを指定すると、各種シェルオプション (zshoptions(1) を参照) を指定したシェルエミュレーションに合ったデフォルト値にリセットします。 こうすることで概ね POSIX sh 互換の動きとなり、概ね P

    mas-higa
    mas-higa 2013/12/03
    その昔 tcsh というのがあってな…
  • バイナリーデータの扱い方 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    http://blog.ueda.asia/?p=1549 「ほう…」と思い覗いてみたのですが、「『シェル芸』か?」という内容でした。 ふつうに外部のイメージ処理コマンド使っているじゃん! まあ、いいんですけどね。 人には言わない心の叫びです。気にしないでください。 外部コマンドとの華麗なコラボもシェルスクリプトの醍醐味の一つです。 後日、私と同じ感想を持った人がいて、それを受けて blog 記事が追加されました。 http://blog.ueda.asia/?p=1616 なるほどー。sed とか awk とか便利だよねー…って、これも「シェル芸」と言えるだろうか? 「芸」というと、もうちょっと、なんというか、その、あれ。 まあ、いいんですけどね。シェルももっと頑張れるんだー…っていうか、ね。 …というわけで、元ネタである 「JPEG ファイルから EXIF 等のアプリケーション付加情報

    mas-higa
    mas-higa 2013/12/03
    "より「シェル芸」らしく、外部コマンドは od(1) だけを利用しています。" それ od芸 ちゃうんか? / ちゃうかった。これはひく。
  • bash, ksh, zsh の速度比較 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog

    bash, ksh, zsh の速度比較 - 拡張 POSIX シェルスクリプト Advent Calendar 2013 - ダメ出し Blog 拡張 POSIX シェルスクリプト Advent Calendar 2013、 1日目の記事です。 「このくらいの要件ならシェルで書ける!」と意気込んで実装を開始して、 たとえやりきっても「あー、やっぱり (あなたの好きな LL) で書けばよかった」 なんてことありませんか? 私はあまりありません。 POSIX シェルやそれ以前の非力なシェルはともかく、bash や ksh、zsh のような拡張 POSIX シェルであれば、少し無理をすれば、大抵の処理は書けます。 老害ですね、わかります。 しかし実装は問題ないのですが、速度がいまひとつなのはどうしても否めません。 そこで一つ、少しでも実行速度を改善する簡単な方法を伝授しましょう。 それは「ba

    mas-higa
    mas-higa 2013/12/03
    "速度がいまひとつ" C で書け
  • 1