しゃのんあどべんとかれんだー 14 日目 (そういえば、気になるコマンドラインのアレ。--) 匿名 匿名 この記事は、しゃのんあどべんとかれんだー 14 日目の記事です。 ![Linux](http://2.bp.blogspot.com/-Icd63F9qe-U/VopyhxdqOZI/AAAAAAAAAVo/2vdBP9IyPHk/s200/Linux-icon.png) どうも、munepom (`@__munepom__`) です。 今回は、コマンドラインでオプションスキャンを強制終了させる -- (ダブルダッシュで良いのでしょうか?) についてです。 # [GETOPT](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/getopt.3.html) のマニュアルによると。。。 コマンドラインオプションを解釈するのに利用される getopt ですが、 『"--" は特殊な引き数で、スキャンのモードによらず、 オプションのスキャンを強制的に終了させる。』 とあります。 # 使うと便利な場面 例えば、"-hogehoge" というファイルを削除したい場合、 `$ rm -hogehoge` と実行すると、 rm: illegal option -- h usage: rm [-f | -i] [-dPRrvW] file ... unlink file のようなエラー警告が表示されますね。 ですが、-- を利用すると、削除することができます。 `$ rm -- -hogehoge` # Perl 5 ではどのように実装されているの? シャノンでは Perl 5 を使っているので、その中で getopt がどのように実装されているのか、調べてみました。 perl 5.22.0 の GetOpt::Long では、下記のような実装でした。 ``` sub GetOptionsFromArray(@) { my ($argv, @optionlist) = @_; # local copy of the option descriptions my $argend = '--'; # option list terminator ... # Process argument list my $goon = 1; while ( $goon && @$argv > 0 ) { # Get next argument. $opt = shift (@$argv); print STDERR ("=> arg \"", $opt, "\"\n") if $debug; # Double dash is option list terminator. if ( defined($opt) && $opt eq $argend ) { push (@ret, $argend) if $passthrough; last; } ... ``` #### ちょっと無駄なことかもしれませんが これを利用すると、シェル変数を perl ワンライナーで参照できます。 `$ perl -se 'print $var . "\n"' -- -var=$USER` を実行すると、ユーザ名が表示されます。 小ネタ探して、レッツ Enjoy! (・ω・)ノ Tweet Share Share Share Share