拡張 POSIX シェルスクリプト Advent Calendar 2013、20日目の記事です。
今日のネタは半分はネタです。
echo
コマンドで -n
を表示するには?
今日はある実験をしていて、echo
コマンドで -n
を出力できないことに気付きました。
https://twitter.com/satoh_fumiyasu/status/413905325037588480
BSD 的な -n オプションで改行を抑制する echo で -n だけ表示するにはどうしたらいいんだ?? あれれ??
詳細は Twitter のスレッドを追っていただくとして、 結論としては次のような感じです。
- BSD な OS の
/bin/sh
(ash),/bin/echo
, dash (ash の派生)echo -n -n
で-n
を出力できる。echo -n -n'改行文字'
で-n
+ 改行を出力できる。
- bash, zsh, GNU echo (coreutils)、
echo -n -n
では何も出力されない。echo -n -n'改行文字'
で-n
+ 改行を出力できる。
先日、echo
コマンドの移植性の問題
を取り上げましたが、同じ BSD 系 echo
でもこんな非互換性があるという話でした。
基本的なコマンドなのにこうも移植性(ポータブル)の問題があるのは困ったものです。
https://twitter.com/satoh_fumiyasu/status/413921866307235840
echo はせいぜい -n オプションだけにしておいて、 エスケープの解釈とかほかのオプションの追加は止めて欲しかったな。 歴史的ウンコ。 https://twitter.com/HackerMaskee/status/413919870019858432 https://twitter.com/n_soda/status/413920848240574465
echo
コマンドの代替、reverb
コマンド
そんな中、 @tnozaki さん (鍵付きアカウント) さんからこんな提案ががが!!
https://twitter.com/tnozaki/status/413930345889665024 (非公式 RT: https://twitter.com/satoh_fumiyasu/status/413941018782756864)
echo(1)の代替のreverb(1)を作ろう(適当)
ウホッ、いい名前! いただきました。 ちなみに「反響」という意味です。
echo
の代替として利用できるポータブルな実装を作成してみました。
シェルのライブラリー (シェル関数) あるいはコマンドとして利用できます。
Reverb.sh
/ reverb
コマンドの使い方
Reverb.sh
内にはシェル関数 reverb()
が定義されています。
仕様は次の通りです。
- 引数をそのまま標準出力に出力する。最後に改行を出力する。
- 引数が複数指定されている場合はスペース (
$IFS
の最初の一文字) で区切られる。 - ただし最初の引数が
-n
のときは最後の改行を出力しない。
お手軽にシェルスクリプトから利用したいのであれば、reverb()
を
コピペし、echo
の変わりとしてください。
Reverb.sh
のまま利用する場合は、まずは適当なディレクトリにインストールしてください。
$ wget -q https://raw.github.com/fumiyas/Reverb.sh/master/Reverb.sh
$ sudo mkdir -p -m 0755 /usr/local/lib/sh
$ sudo cp Reverb.sh /usr/local/lib/sh
$ sudo chmod 0755 /usr/local/lib/sh/Reverb.sh
シェルのライブラリーとして利用するには、シェルスクリプトから .
または
source
コマンドで Reverb.sh
をロードし、reverb
コマンドを呼びます。
$ export PATH="/usr/local/lib/sh:$PATH"
$ sh -c '. Reverb.sh; reverb Foo Bar'
Foo Bar
$ sh -c '. Reverb.sh; reverb Foo; reverb Bar'
Foo
Bar
$ sh -c '. Reverb.sh; reverb -n Foo; reverb Bar'
FooBar
コマンドとして利用するには、Reverb.sh
を reverb
という名前で起動できるようにします。
$ sudo ln -s /usr/local/lib/sh/Reverb.sh /usr/local/bin/reverb
$ reverb Foo Bar
Foo Bar
$ reverb Foo; reverb Bar
Foo
Bar
$ reverb -n Foo; reverb Bar
FooBar
にゃんぱすーコマンドとして利用することもできます。
$ sudo ln -s /usr/local/lib/sh/Reverb.sh /usr/local/bin/にゃんぱすー
$ にゃんぱすー
にゃんぱすー
便利ですね!!
ちなみに、れんげより蛍と小鞠がカワイイです。
ところで、12月25日はクリスマスな上に、
OSS 界隈で地味に活躍されているふみやすさんの誕生日ですね!
っ http://www.amazon.co.jp/registry/wishlist/27M7TV8CEEF6G?sort=priority
逆に、あなたの書いた OSS や Blog や Advent Calendar が気に入ったら何か送りたく なってしまうかもしれないので、プロフィールや Web サイトに あなたの Amazon 欲しいものリストの URL を貼っておいてくださいね!
私が勤める OSSTech っていう某弊社で社員募集しているようです。 人材紹介会社を介さなければ、入社後に 20万円のボーナス! 「ふみやすっていう人に紹介された」と言ってもらえると私にもボーナス!! → https://www.osstech.co.jp/recruit/
よろしければ、これまで参加した/参加予定のほかの Advent Calendar もどうぞ。
- Ansible Advent Calendar 2023
- シェル芸 Advent Calendar 2023
- 闇の魔術に対する防衛術 Advent Calendar 2023
- Ansible Advent Calendar 2023
- Ansible Advent Calendar 2020
- DNS温泉 Advent Calendar 2019
- OSSTech Advent Calendar 2019
- Ansible Advent Calendar 2018
- OSSTech Advent Calendar 2018
- Debian/Ubuntu Advent Calendar 2017
- Linux Advent Calendar 2017
- Shell Script Advent Calendar 2017
- Shell Script Advent Calendar 2016
- OpenLDAP と仲間たち Advent Calendar 2015
- Postfix Advent Calendar 2014
- 拡張 POSIX シェルスクリプト Advent Calendar 2013