タグ

シェルスクリプトに関するhyconのブックマーク (27)

  • bash の危険な算術式 - どさにっき

    ■ bash の危険な算術式 _ 使ってる人がいちばん多いだろうからタイトルでは bash としてるけど、ここで取り上げることは zsh および ksh 一族(家 ksh、pdksh、mksh)にも該当する。ash、dash などでは該当しない。 _ 以下のシェルスクリプトには脆弱性がある。わかるだろうか。 #!/bin/bash # "品目,単価,個数" の形式の CSV を読んで、"品目,合計金額" の形式で出力する csv="foo.csv" while IFS=, read item price num; do echo "$item,$((price*num))" done < "$csv" これ、細工された CSV ファイルをわせることで、任意コードの実行ができてしまう。数ある脆弱性の中でもとくにヤバいやつだ。どこが穴なのかというと、タイトルにもあるとおり算術式なのだが、し

  • シェルスクリプトでset -eしているときに処理を中断せずエラーを扱う方法

    シェルスクリプトで set -e (errexit) しておくと、スクリプト中に実行したコマンドの終了ステータスが「非0」だった場合、つまりコマンドが失敗したときにそこでスクリプトを中断してくれるようになります。(終了ステータスとは「Exit code」「Return status」などと呼ばれるものです。) 都度エラー判定を書かなくてもよくなるので便利なオプションですが、個別にエラーハンドリングをしたくなった時にも意図せずスクリプトが中断されてしまい困ったことになります。 例えば、以下の例は false コマンドの実行で失敗扱いとなり、そこでスクリプトが中断されるため「finish」が出力されることはありません。 set -e # false コマンドは必ず終了ステータスに 1 (失敗) を返すコマンド # エラーが起きたとみなされスクリプトは中断される false # このコマンドは実

    シェルスクリプトでset -eしているときに処理を中断せずエラーを扱う方法
  • POSIX shの変数展開による文字列置換の限界を探る - Qiita

    シェルスクリプト中で文字列置換をしたくなったら普通はsedやawkを呼び出すのが正解でしょう。ただ、世の中にはプロセスのforkが異常に遅い環境というのがあるので(CygwinとかMSYSとか)、シェルスクリプト内で頑張りたくなることがあります。 そんなときに使えるのがシェルの変数展開の機能です。特に下記の4つの書き方はPOSIX shがサポートしているのでポータビリティの観点でも安心して使うことができます。 表現 説明

    POSIX shの変数展開による文字列置換の限界を探る - Qiita
  • シェルスクリプトの set -e は罠いっぱい

    ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu Perl では最初に use strict; use warnings すべきなように、シェルでは set -u すべき。「例外処理って何? おいしいの?」って人は set -e もしておけ。 2012-06-25 18:25:20 ふみやす@シェルまおう(自称でない) FGO:838,149,789 @satoh_fumiyasu シェルスクリプトをまともに書けない奴は、それでも書かなければならないときは、とりあえず変数展開するとき必ずダブルクォートで括れよ。$foo じゃなくて "$foo” な。あと最初に set -u; set -e でもしておきな。シェルスクリプトが駄目なんじゃなくて、書けないだけ。 2012-12-22 00:27:38

    シェルスクリプトの set -e は罠いっぱい
  • IPv6アドレスをシェルスクリプトで扱いやすくするための小物 - Qiita

    前置き IPv6アドレスを扱う場合、その表記は極力短くなるよう省略が行われます。例えば2001:08db:0000:0000:0000:0000:0012:3456というアドレスは2001:8db::12:3456になるといった具合です。先頭の0を省略する、程度だったら切り出すのも簡単なのですが、コロン区切りのフィールドの数が省略によって可変になるというのが厄介です。 起動時に実行されるinitスクリプトの中でNICの初期化でIPv6アドレスを扱うとなった場合、その表記の柔軟性によりそのままだとシェルスクリプトでプレフィックスを切り出して加工するなどといった操作が難しいので、省略した部分を復元するようなシェルスクリプトを書きました。 すること IPv6アドレスは128bitあるものを16bit毎に区切ってコロンで区切ることにより8個のフィールドで表記される。省略することによってフィールドが

    IPv6アドレスをシェルスクリプトで扱いやすくするための小物 - Qiita
  • Bashの擬似シグナルを使ったデバッグ方法 - harry’s memorandum

    少し前にオライリーの入門Bashを読んで、このデバッグ方法を知って「おおー」と感動をしたので、この喜びを書いてみました。 sh系には trap というコマンドでシグナルトラップができて便利ですが、bash にはさらに便利な疑似シグナルというものがあったりします。bashのmanpagerをみると、trapのsigspecをERRとした場合、コマンドが0以外でexitした場合にトラップしてくれるようです。 If a sigspec is ERR, the command arg is executed whenever a simple command has a non-zero exit status, subject to the following conditions. The ERR trap is not executed if the failed command is pa

    Bashの擬似シグナルを使ったデバッグ方法 - harry’s memorandum
  • シェルのパイプの速度(進捗バー) は pv で - Qiita

    シェルでコマンドをパイプをつなげている時、 どれくらいの速度でパイプをデータが通過しているのか知りたい事がある。 pv コマンドを使うと分かる。 pipe viewer の略で pv らしい。 使用例

    シェルのパイプの速度(進捗バー) は pv で - Qiita
  • bashの組込みコマンド自作によるスクリプトの高速化 - Qiita

    はじめに bashには次の2つの理由によって、組み込みコマンド(builtin command)というものが存在します。 スクリプトの高速化のため。組み込みコマンドであれば通常のコマンドを実行する場合に比べてプロセスの生成コスト(fork()/exec())が削減できる bash自身の状態を変更させるため。例えばcdコマンドを/bin/cdとして用意してbashから当該コマンドを実行しても、当該コマンドのpwdが変更されるだけで、bashのそれは変更されないため、意味がない 今回は前者に焦点を合わせて、その効果と、組み込みコマンドの自作方法について述べます。 予備知識: 組込みコマンドによるスクリプト高速化の効果 組込みコマンドそのものの存在、及びその存在意義について既にご存知のかたは、この節を飛ばしてもらって構いません。 例えば皆さんがbashスクリプトからechoコマンドを実行した場合

    bashの組込みコマンド自作によるスクリプトの高速化 - Qiita
  • シェルスクリプトで音声ファイルの波形を画像化するやつ - Qiita

    最近、ハイレゾ音源なのにダイナミックレンジを殺したミキシング・マスタリングで海苔波形が云々という文句をアニメ方面からよく聞くので、じゃあ自分が持ってる息の長いバンドの音源を見比べてみようかと思うも、音源を編集ツールに読ませてスクショするのは面倒でダサいし、かといって視覚的に出力するツールを知らないし、ということでそういうツールを自作することにしました…シェルスクリプトで。 ソース #!/bin/sh -e # License: CC0 # mktemp(1)はPOSIX外 tmp=$(mktemp -d) clean() { rm -rf $tmp } trap clean EXIT # オプション # -v,-m 音量の基準線を追加する。 # 線の引く位置を -v はdB、-m はサンプルに対する倍率で指定 # -r 基準線に合わせて出力波形も拡大縮小する level= reduce=

    シェルスクリプトで音声ファイルの波形を画像化するやつ - Qiita
  • UNIXの部屋 検索-リダイレクト

    最終更新 2019-01-27 UNIX/Linux のシェル sh・bash・csh・tcsh のリダイレクトを説明する。ファイルへの出力、コマンド出力を別のコマンドの入力とする、標準入力・標準出力・標準エラー出力、パイプなどもあわせて説明する。

  • Bash/Zsh + POSIX で sleep 0.01 する方法 - Qiita

    ■ 問: シェルスクリプトで 0.01 秒間などのごく短い時間だけ sleep する方法は? それもできるだけ精確に。 この問いは一見して簡単な問いに思われるが、考えて見ると意外と難しい。 後で詳しく説明するが、POSIX (Unix の規格) では sleep に小数は指定できない。また、外部コマンド sleep の起動自体に余分な時間が掛かることも問題になる。 記事更新 (2020-04-11): 記事 "POSIX準拠シェルスクリプトだけで1秒未満sleepを実現する - Qiita" 言及 記事更新 (2018-08-18): Bash 5.0 以降の EPOCHREALTIME について追記 記事更新 (2018-08-18): 最近の Cygwin の /dev/tcp/*/* について追記・修正 記事更新 (2018-07-26): Bash 4.4 以降の Bash loa

    Bash/Zsh + POSIX で sleep 0.01 する方法 - Qiita
    hycon
    hycon 2016/06/28
    泥沼的だ…
  • rm -rf /は実行されないのが正しい? - Qiita

    いくつかのUnixプラットフォームではrm -rf /はエラーになり実行されない。これは余計なおせっかいで実行されるべきだと言う人もいるが、最新のPOSIXに従うのなら「実行されない」のが正しい。POSIX.1-2008ではrmについて、「引数がルートディレクトリを指しているなら、標準エラーに診断メッセージを出力して、それ以上何もしてはならない」と定めている。 if an operand resolves to the root directory, rm shall write a diagnostic message to standard error and do nothing more with such operands. POSIX.1-2004にはこの記述はないので、最新の規格に従ってないrmではrm -rf /が普通に実行される可能性がある。 実装を調べてみると、2003

    rm -rf /は実行されないのが正しい? - Qiita
  • シェルスクリプトで排他・共有ロック&セマフォ - Qiita

    どのUNIXでも通用するロック機構はあるのか? 他言語では大抵用意されているロック機構であるが、シェルスクリプトにはロック機構を直接実現するコマンドが無い。flockコマンドやlockfコマンドなどOSによっては独自コマンドがあるが、OS独自ゆえ、それらを使ってしまうとシェルスクリプトの可搬性は失われてしまう。(しかも前述の2つのコマンドは、ファイルロックのコマンドであるうえに、ロックがかかっている間は次の行に進めない) 「特定のOSに縛られてしまうくらいなら他の言語を使う方がよっぽどマシだ」といって、シェルスクリプト信者(POSIX原理主義者)を増やせないのが悔しかったのだが、ようやく作るのに成功したので報告する。 これで、 排他ロック…………………pexlockコマンド 共有ロック…………………pshlockコマンド セマフォ……………………(pshlockコマンド、共有ロックの応用)

    シェルスクリプトで排他・共有ロック&セマフォ - Qiita
  • Linux/UNIXで文字列から特定部分(右から・左から何個、〇〇\~〇〇まで)を抜き出すコマンド | 俺的備忘録 〜なんかいろいろ〜

    ちょっとしたスクリプトを作っていた際、文字列の抜き出しを多様する処理があったので忘れないように残しておく。 2017/01/14 追記 個人的な好みで、変数へ代入をしてこなかった(スクリプト書かずにシェル芸で対応することのほうが多いため)のだが、スクリプトで書くなら変数に代入してからパラメータ展開によって文字列を抜き出す方法もあるので、念のため追記しておく。 左から◯文字 cut -c [開始文字(個数)]-[終了文字(個数)] [root@test-node ~]# # 例:左から1文字目~4文字目 [root@test-node ~]# echo abcdefghijk | cut -c 1-4 abcd [root@test-node ~]# [root@test-node ~]# # 例:左から2文字目~5文字目 [root@test-node ~]# echo abcdefghi

    hycon
    hycon 2016/04/12
    bashなら${var:idx:len}の組み込み機能の展開使った方がいい/外部コマンド使うならexpr(1)じゃないかなぁ。いちいちrevを2回呼び出すのは重いしcoreutils依存
  • シェルスクリプトの中で1行ずつ変数を分割する際には、cutとかawkとか余計なプロセスを起動せずsetを使って分割した方が効率的 - 双六工場日誌

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

    シェルスクリプトの中で1行ずつ変数を分割する際には、cutとかawkとか余計なプロセスを起動せずsetを使って分割した方が効率的 - 双六工場日誌
  • シェルで変数のインクリメントに expr を使うと100倍遅い件

    シェルプログラミングにおいて、ループカウンタなどをインクリメントするとき、どのようにしますか? いきなりですがサンプルから。 #!/bin/bash COUNT=0 while [ $COUNT -lt 1000 ]; do # 何かの処理 COUNT=`expr $COUNT + 1` # COUNT をインクリメント done expr コマンドを使う? シェルプログラミングの入門記事などを見ると、変数のインクリメントに上記のような COUNT=`expr $COUNT + 1` を用いているものが多くあります。 しかし、この書き方は とても遅い です。空のループを1000回繰り返すだけでも手元の mac (Core i7) で約2秒もかかってしまいました。

    シェルで変数のインクリメントに expr を使うと100倍遅い件
    hycon
    hycon 2015/01/04
    $(())の数値計算はPOSIX標準だしexpr使ってると*のクオート忘れとかオペランドをわざわざ引数毎に分けないといけないとかのバグの温床なのでいつもこっち使うべき
  • シェルスクリプトで外部コマンドを利用する場合の注意点 · さよならインターネット

    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

  • CalCurio.com is for sale | HugeDomains

    Make 24 monthly payments Pay 0% interest Start using the domain today. See details

    CalCurio.com is for sale | HugeDomains
  • シェルスクリプトを書くときに気をつける9箇条 - Qiita

    最新の類似投稿としてシェルスクリプトのコーディングルール2014も併せてどうぞ。 2014/10/09追記 ぼくがシェルスクリプトを書くときに気にしていること、過去の失敗で書き留めたことを忘れないために。 1. グローバル変数は大文字 PATH や HOME など、環境変数が大文字なので、エクスポートする変数を大文字で書くという習慣は一般的であるような気がしますが、エクスポートする変数を抱えるシェルスクリプトを作成する機会が稀なので。 グローバル変数は大文字 ローカル変数は小文字 エクスポートする変数も大文字 関数内からグローバル変数にアクセスする場合がありますが、やはり区別していると、可読性が増すような気がするのでお勧めです。 2. awk を知る Unix 上にて文書処理をするときに、数多くのフィルタコマンド(grep、cut、tr、head、sort、uniq、sed、awk、wc、

    シェルスクリプトを書くときに気をつける9箇条 - Qiita
  • データ集計コマンドを極めてシステム処理と業務速度を爆速化するお話 - Y's note

    Index データ集計コマンド 爆速で検索したいぜ! lookを使う LC_ALL=Cを設定する データのランダムサンプリングがしたいぜ! sedを使う awkを使う sortの--random-sortを使う Script言語を使う shufを使う ランダムサンプリング速度比較 合計と平均値を集計したいぜ! 列データ取得 重複行のカウント 合計値出力 平均値出力 複数ファイルのデータ結合がしたいぜ! 共通項目での結合 同じ行数での結合 まとめ データ集計コマンド joinコマンドが便利過ぎて生きるのが辛い - Yuta.Kikuchiの日記 lookコマンドによる二分探索が速すぎて見えない - Yuta.Kikuchiの日記 今日はデータ集計を行う上で絶対に覚えておいた方が良いコマンドと知識を紹介したいと思います。これを身につければシステム処理と業務効率化に大きく繋がると思います。この記

    データ集計コマンドを極めてシステム処理と業務速度を爆速化するお話 - Y's note