ときどきの雑記帖 RE* (新南口)
昔千里も今一里
アポロ13号とスペースシャトルに使われたスイッチ類のレプリカ、配線すれば使用可能! | ギズモード・ジャパン
特に使い道は思い浮かばないけどちょっと欲しいなこれ 😄
ヘウレーカ
これもEテレの番組ですが、毎回ではないにしろそこそこの率で観ています。 2/3の放送 「どうすれば“密”を避けられる?」 - 又吉直樹のヘウレーカ! - NHK は渋滞学も出てきて面白かった。
コマンドラインオプションの引数
さらに続くsedネタ。
sedの使い方 のコメントや
Mac(BSD)でcpをGNU的に使う + おまけ
で言及されているけど、
GNU sed と BSD sed(という呼び方が妥当かはわからんけど)では
同じ -i
オプションでも微妙な違いがあって、そこに引っかかっている人がそれなりの数いる模様。
sedもGNUとBSDでちょっと違う所があります。
ファイルを直接書き換えるコマンドで
$ sed -i 's/foo/bar/g' test.txt
とGNU sedですると、test.txtの中のfooがbarに変換されます。 -iに続いて.bak等とサフィックスを与えれば元のファイルが test.txt.bak と言う風にバックアップされます。
これがBSD sedだと
$ sed -i 's/foo/bar/g' test.txt sed: 1: "test.txt": command a expects \ followed by text
等と怒られます。BSDの場合では-iに続いて必ずサフィックスを指定しなくてはならず、 バックアップが要らない場合でも空の"“を与える必要があります。
(略)
ただ、この"“を与える際、GNU sedの場合、-iと離すと(sed -i ““とすると)次の引数として 取られるのでエラーが出ます。
一方、BSD sedの場合、-iとくっつけて渡すと(sed -i"“とすると)エラーになります。
sed - BSD/macOS Sed vs. GNU Sed vs. the POSIX Sed specification | sed Tutorial でも
Incompatible features:
Use of the -i option without an argument (in-place updating without backup) is incompatible:
BSD sed: MUST use -i ’’
GNU sed: MUST use just -i (equivalent: -i’’) - using -i ’’ does NOT work.
のように書かれているのだけど、-i''
としたときに
コマンドにどういう内容が渡っていると思っているんだろうか?
$ cat args.c
#include <stdio.h>
int
main(int argc, char **argv)
{
for (; *++argv;)
printf("**%s**\n", *argv);
return 0;
}
$ gcc -oargs args.c
$ ./args -i'' foo bar
**-i**
**foo**
**bar**
$ ./args -i '' xyzzy
**-i**
****
**xyzzy**
でまあ、GNU sed は
-i[SUFFIX]
–in-place[=SUFFIX]
のように -i オプションに対する引数が省略可能なのに対してBSD (ここではFreeBSDから)のものは
sed [−Ean] [−e command] [−f command_file] [−i extension] [file …]
-i オプションは引数必須なんですな。
規格的な話をすると、
Guideline 7:
Option-arguments should not be optional.
と、GNU のようにオプションの引数を省略可能にするのは推奨されていないし、 そもそも sed の -i オプションもない (sed) のだった 😄
GNUのgetoptに関してはこういう話もある (このページはコマンドとしてのgetoptのものだけど、 ライブラリ関数としてのgetoptの仕様に言及している。 が、なんで getopt(3)のページ Man page of GETOPT にはそれの影も形もないの…)
バグ
getopt(3) 関数は、引き数が任意のロングオプションが、空の任意引き数を渡された場合でも、解析できる (だが、ショートオプションについては、それができない)。この getopt(1) コマンドは、空の任意引き数を、 引き数が存在しないかのように処理している。