route127曰く、 sedでバッハの平均律クラヴィーア曲集第1巻(WTC Book I)前奏曲ハ長調(BWV846)を演奏するスクリプト「bash.sed」が発表された(github、はてなブックマーク) Linux上での実行方法
みなさんはHomebrewをお使いでしょうか。macOSをお使いの多くの開発者が使っていると思います。 HomebrewのインストーラーはRubyで書かれており、次のコマンドでインストールするようになっていました。 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" HomebrewがRubyに依存していることは良いのですが (formulaの書きやすさはRubyならでは)、インストーラーの話になると事情が変わってきます。HomebrewのインストールコマンドはmacOSの工場出荷状態でも動く必要があります。こういうものにRubyを使っているのはリスクがあります。 将来的にmacOSデフォルトにRubyやPythonが含まれなくなる (参考リンク
はじめに 個人的なシェル(スクリプト)あるあるなんですが、変数操作に悩んでいるとBashの 変数展開 って思った以上に色んなことができてしまうことに気がつきます。 「なんかいい感じの書き方ないかなー」 「cut, tr, sed, awk, ...、まぁできるのは間違いないんだけど」 「うーん」ググリ― (10分後) 「えっ、変数展開...?(怪訝)」ポチポチ 「...」カタカタ 「いけるやん!!!」 ってことが結構あります。皆さんもこういった経験少なからずあるのではないでしょうか。 (そして今もまさにそういう記憶・期待があるから、変数展開について少し調べている...そんなところかと推察します) 毎回調べるのも感動があっていいと思うんですが、もはや衝動を押さえきれないので 全部調べたい と思います。 Bashのバージョンは 4.3.48(1) でしたが、そうそう変わるような内容でも
■ 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 ファイルを食わせることで、任意コードの実行ができてしまう。数ある脆弱性の中でもとくにヤバいやつだ。どこが穴なのかというと、タイトルにもあるとおり算術式なのだが、し
背景 bashクックブック を読み進めています。 標準で ON にしておくと良さそうな設定がありました。 Bashでリダイレクトにより誤って既存ファイルを上書きしてしまわないようにする設定です。 環境 $ uname -a Darwin genzouw-MacBook-Pro.local 15.2.0 Darwin Kernel Version 15.2.0: Fri Nov 13 19:56:56 PST 2015; root:xnu-3248.20.55~2/RELEASE_X86_64 x86_64 i386 MacBookPro10,1 Darwin $ bash -version GNU bash, バージョン 4.3.42(1)-release (x86_64-apple-darwin14.5.0) Copyright (C) 2013 Free Software Founda
「これ知らなきゃ分からないだろ!」 「エラーの原因はわかったけど、なんか腑に落ちない」 いま悩んだ2時間返せ! bashというか、UNIXのコマンドに慣れてない 僕みたいな新人エンジニアが 気をつけた方がいいポイントまとめました。 あいことばをわすれない 微妙にエラーが出ないため、気づかないまま進んでしまい、 のちのち絶妙に致命的なことになってしまうので注意。 一行目忘れて2時間悩みました 二行目のオプションつけなかったため2時間悩みました setのオプションはお好みで あいことばの解説: http://qiita.com/magicant/items/f3554274ee500bddaca8 半角スペースをつけるな!半角スペースをつけろ! shellさんはスペースに非常に神経質です。 よくある変数代入では=の前後にスペースいれてはダメです。
Bash on Ubuntu on Windows (以下 BoW) は Windows コマンドプロンプトを使って実行される。今までであれば Windows のコマンドプロンプトはエスケープシーケンスを認識しなかったので cmd.exe そのものでは vt100 等の端末環境を用意できませんでした。しかし Windows10 の cmd.exe では新しいコンソールモードが用意されています。 Console Virtual Terminal Sequences (Windows) Virtual terminal sequences are control character sequences that can control cursor movement, color/font mode, and other operations. https://msdn.microsoft.c
ダメ人間の日常 例えば適当なファイルを一時的に落としてきてちょっと使ったら捨てたいだとか、そんなとき僕はよく mkdir /tmp/a; cd /tmp/a してから何かするとかやってたんだけど、これ良くない点が色々ある。 一時ディレクトリに使う名前のボキャブラリが貧困な上に掃除もサボるので名前が被りまくってmkdirが中々出来ない→結果こうなる 後始末しないで放置も多いのでゴミファイルが増えてディスクの無駄だしパスワードや個人情報とか消すべきセンシティブな情報が含まれてると色々問題。 一時ディレクトリでの作業が終わったら元いた場所に戻りたいけど元いた場所が深いとこだったりすると戻るのが面倒だしそもそも何やってたか忘れてる事も…。 tmpspaceコマンドで解決だ! そこでそんな問題を解決するために以下のような bash 関数を作って、~/.bashrc とかに書いておくことにした。 #
#!/bin/bash echo ' 256色 前: 38;05;色番号 背: 48;05;色番号 ' for i in {0..255} ; do printf "\x1b[38;05;${i}m 38;05;${i} " done echo '' for i in {0..255} ; do printf "\x1b[48;05;${i}m 48;05;${i} " done echo '' Register as a new user and use Qiita more conveniently You get articles that match your needsYou can efficiently read back useful informationYou can use dark themeWhat you can do with signing up
それぞれのターミナル環境で色の設定違うと思われるので色の確認できるスクリプトあると便利。自分の場合は強調表示がオレンジ色付いたりとかすぐ解る。 #!/bin/bash echo -e " # Attribute codes: # 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed # Text color codes: # 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white # Background color codes: # 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white 状態番号 \033[00m デフォルト状態 00 \033[
マイクロソフトのハンセルマンのBlog: Developers can run Bash Shell and user-mode Ubuntu Linux binaries on Windows 10 Ubuntuの中の人のBlog: Ubuntu on Windows — The Ubuntu Userspace for Windows Developers この2つのBlogで実態が明確になったのでまとめてみます。 使用可能になるOSまもなくリリースされる予定のWindows 10 ”Anniversary” アップデートで使用可能になります。このアップデートで、開発者向けの機能として追加されます。 機能の追加で、Windowsの設定で開発者モードを有効にすると使用できるようになります。これでネイティブなユーザー モードのLinuxシェルが使えるようになり、bashを起動するとWind
シェルスクリプトでパス文字列からファイル名/ディレクトリ名/拡張子を抽出するより。bashの「変数展開」を使うと、ファイルパスからディレクトリパス部分をさくっと取り出せます。具体例は以下。 $ path=aaa/bbb/ccc.bin $ echo ${path%/*} aaa/bbb 変数展開「${<変数名>%<パターン>}」で「変数の末尾がパターンにマッチする場合、マッチした部分を削除」できるので、 パターンで「/*」を指定することで、ファイル名部分を除外したディレクトリパスが取得できる という仕組みです。 なお、Bashシェルスクリプト/特殊な変数展開によると「bash」で追加された機能とのことなので、他のshでは使えないかもです。ローカル環境で↓を試して、 $ sh sh-2.05b# path=aaa/bbb/ccc.bin sh-2.05b# echo ${path%/*} a
例えば,ディレクトリ /tmp/hoge に print.ps というファイルが作成されたら,それを自動的に印刷するようにしたい場合,ファイル作成イベントを監視する必要がある. inotifywait というコマンドを使えばそれが簡単にできるので,紹介する. 次のbashスクリプトは, /pstmp というディレクトリにファイルが作成されたら,そのファイルを別ユーザアカウントで kghostview で開く,というものだ*1. #!/bin/bash # required package: inotify-tools psout_dir=/pstmp m_account=aki-yam events=(-e CREATE -e MODIFY -e MOVED_TO) while inotifywait ${events[@]} $psout_dir; do psfile=$psout_di
phpunit を実行させるために Grunt を使いましたが・・・ PHP 開発でも Grunt を使う - ngの日記 まあファイルの更新を監視して phpunit(に限らず任意のコマンド)を実行するだけならワンライナーです。 $ inotifywait -e create,delete,modify,move -mr src tests|while read;do while read -t 0.3;do :;done;phpunit -c tests;done バラすとこうなります。 $ inotifywait -e create,delete,modify,move -m -r src/ tests/ | while read; do while read -t 0.3; do : done phpunit -c tests/ done ただし Linux に限る。 inotif
こういうシェルスクリプトがあるとする. -eしてるので,途中でエラーが出たときには止まってほしい. #!/bin/bash -e echo 1 ehco 2 echo 3 止まってくれ……!! % ./a.sh 1 ./a.sh: line 4: ehco: command not foundちゃんと止まった. ところで,bash ./a.shとか,cat a.sh | bashとかして実行してみると,3まで実行されてしまう!!!. % bash ./a.sh 1 ./a.sh: line 4: ehco: command not found 3 % cat ./a.sh | bash 1 bash: line 4: ehco: command not found 3 こういったことがあってはつらいので,bash -eじゃなくて,set -eしましょう. #!/bin/bash set -
いつも作るシェルスクリプトをテンプレート化してみた(オプション、引数チェック) bashでシェルスクリプトを書くと、オプションや引数チェックのロジックはいつもお決まりになるので、今回テンプレート化してみた。オプションと引数を解析して変数に格納、もし想定外のパラメータが入力された場合は使い方を標準エラー出力し、異常終了(exit 1)する、というもの。 作ったテンプレートはこちら。 template.sh #!/bin/bash # usage cmdname=`basename $0` function usage() { echo "Usage: ${cmdname} [-t] [-f file] arg1 arg2" 1>&2 } # check options topt=FALSE while getopts tf: option do case ${option} in t) to
getoptsではロングオプションは使えないということになっているが・・・ while getopts "\-:" opt do case $opt in -) # long options case $OPTARG in help) print_help;; *) echo "unknown option: $OPTARG"; exit 1;; esac;; ?) if [[ $opt = "?" ]]; then uopt=$OPTARG else uopt=$opt fi echo "unknown option: $uopt"; exit 1;; esac done shift $((OPTIND - 1)) これでどうだ! ロングオプションで更に値付きまでは検証してないが、OPTIND使うとか、あるいはオプション処理する毎に shift しといて $1 とるとかでなんとかなるか?
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く