拡張 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 はまだ推奨できません。
Revision 1.25 Paul Armstrong Too many more to mention Bash is the only shell scripting language permitted for executables. Executables must start with #!/bin/bash and a minimum number of flags. Use set to set shell options so that calling your script as bash <script_name> does not break its functionality. Restricting all executable shell scripts to bash gives us a consistent shell language that'
I'm trying to put a command in a variable, but the complex cases always fail! Variables hold data. Functions hold code. Don't put code inside variables! There are many situations in which people try to shove commands, or command arguments, into variables and then run them. Each case needs to be handled separately. For the simple case in bash, you can use an array to store arguments to pass to a co
I don’t like to write programs in bash. It’s not a very pretty language. But it has one advantage over a lot of other languages: It’s on your system. Every Unix-like system has /bin/bash; Redhat, Ubuntu, and even OS X. But bash is still a lousy language. This is where bash tracebacks come in… “Whaaaaa? Bash has tracebacks?” I can hear you ask. Yup, it can. Check out the gist below. It is both a de
We're currently working to get bash-completion at its best. This is what we plan to do in the near future: make a better homepage (you really want it, don't you? ;) ); make bash-completion dynamically load completions. Please join #bash-completion on irc.debian.org if you want any information. There you'll probably find luk__ (Luk Claes) or hanska (David Paleino), who might give you some more info
本稿で紹介する BashDiff は、bashシェルに適用するパッチの1つであるが、これを用いることで実に多彩な機能追加が可能となる。具体的には、awkの一部機能をシェル本体に組み込む、C言語の一部機能をbashシェルプログラミングで使用可能とする、例外の処理機構を追加する、関数型プログラミングに特有なリスト内包表記やmap関数などの機能を提供する、GTK+2やデータベースとの通信機能を設けるといった、通常のbashには用意されていない機能を利用可能にするのだが、それだけに止まらず、Webサーバ機能を標準のbashシェルに組み込むことすらできるのだ。 残念ながら、openSUSE、Fedora、Ubuntuのリポジトリに、BashDiffパッケージは収録されていない。私の場合も、BashDiff 1.45を用いたソースからのビルドを、bash 3.0の動作するx86 Fedora 9マシン
bashの内蔵コマンドだけでいかにRuby on Railsっぽいことをやるかというパロディ企画です。今回は番外編です。 オープンソースカンファレンス2008 Tokyo/Springというイベントのライトニングトークで、Bash on Railsについて発表してきました。 そのときのスライド。さしさわりのありそうな部分は削ってます。 持ち時間5分の中で、前半の2分半をプレゼンに、後半の2分半をデモに使うというペース配分で登壇。前半はそれなりに勤めましたが、誤算だったのは後半。ビビって手が震えてキーがまともに打てない。なんとか設定を済ませてアクセスしたら「404 Not Found」ってところでちょうど時間終了となりました。 いつもの名司会さんとか、懇親会でお話した方々とか、ブログとかの話では、あの失敗がウケたようで。いや、あれ素なんですが。まぁウケたからいいや。 で、懇親会でもライトニン
Tera Term 等の端末を複数同時に立ち上げて作業したり、screenにて複数の仮想端末を同時並行で操作する際、コマンド実行履歴が端末間で共有できなくて困る事が多々あります。「さっきのfindコマンドをもう一度... 引数どう書くんだっけなぁ... あ、確かコマンド履歴にあったはずだなぁ... ちっ、それはあっちの端末の履歴だったか」みたいな。zshには端末間のコマンド履歴を常に同期できる'SHARE_HISTORY' なるオプション(*1)があって素敵なのですが、同じことを bash で実現する方法を調べたのでご紹介。 (*1) zshの同機能について詳しくはITmedia記事 "豪傑の三種の神器【後編】" を参照の事 不具合) 通常設定のbashで困る事 1. 複数端末間でコマンド履歴の共有ができない 同時に立ち上げている端末間で履歴の共有ができなくて不便に感じることがある。 2.
このブログに含まれる「DSAS」という文字列をgrepしてみます。 どこに「DSAS」があるのかさっぱりわかりません (^^; grepの結果を| less -p DSASとかに渡せばlessがハイライトして識別しやすくなるのですが、ここはgrepのカラフル機能(--color=auto)を使ってみます。 だいぶ識別しやすくなりました。 ハイライトの色を変更するには、色指定を環境変数GREP_COLORにセットします。指定の形式は前回紹介したlsのdircolorsと同じです。例えば、太字の黄色にしたい場合はこのようにします。 export GREP_COLOR='01;33' あと、毎回--color=autoと指定するのは面倒なので、環境変数GREP_OPTIONSにセットしておきましょう。GREP_OPTIONSにセットしたオプションは、暗黙的に効果を発揮します。 export GR
ターミナルがあればご飯三杯いけるぐらいのCUI大好きっ子なんですが、ターミナルの画面はモノトーンで殺風景なのでどうも色気がありません。 色気はさておき、逆説的ですがモノトーンのターミナルで色を使うと、視認性がグッと上がります。 というわけで、今回から数回にわけて、ターミナルの中で色を効果的に使い、いかに色気を出すか、もとい、視認性を高める方法を紹介します。 第1回は ls (GNU coreutilsのls-5.2.1) を取り上げます。 $ ls -F broken-symlink@ directory/ file file.orig write-blog.todo ddl.sql executable* file.bak symlink@ Debian (sarge) だとこんなしかけでカラー化が有効になっています。 シェルの初期化ファイル (bashrcやbash_profile)
This tutorial assumes no previous knowledge of scripting or programming, yet progresses rapidly toward an intermediate/advanced level of instruction . . . all the while sneaking in little nuggets of UNIX® wisdom and lore. It serves as a textbook, a manual for self-study, and as a reference and source of knowledge on shell scripting techniques. The exercises and heavily-commented examples invite ac
今回は少々マニアックというか,重箱の隅的お話です. bash(1) には,複数のコマンドをまとめたり,コマンドの実行結果をコマンドラインに取り込むための記法が複数あります.それらのコマンドを実行するために,bash は必要に応じてサブシェルを起動しますが,どういう記述をした際にサブシェルが起動されるのか,いまいちはっきりしなかったため,実際に試してみました.今回試したのは,( ), $( ), { }, <( ) です. を実行して,ps コマンドの親プロセスがどれになっているかで確認しています.bash が設定する $PPID 変数を見ないのは,変数の展開をどのシェルがするかに依存するために,確認しにくいからです.ps コマンドを --forest オプション付きで単純に起動すると $ ps --forest PID TTY TIME CMD 20218 pts/18 00:00:00
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く