[bash] Linuxでリダイレクトがよくわからなくなったときの確認

標準出力と標準エラー出力のリダイレクト

Linuxで標準出力や標準エラー出力をファイルに保存するのにリダイレクトさせたり、ファイル保存しつつ、端末表示するときにteeコマンドを使ったりするのは日常的にあるだろう。
でも、bashで複雑なリダイレクトをしていると、どのように動作しているのかよくわからなくなってくるときがある。
こんなときは /proc/self/fd を表示させて、確認しよう。

例えば、標準出力と標準エラー出力をそれぞれ、別のファイル(out.log, err.log)に出力しつつ、端末表示させたい場合は次のような書き方ができる。
$ { { somecommand | tee out.log 1>&3; } 2>&1 | tee err.log; } 3>&1

[Java] ジェネリックメソッドの戻り値でワイルドカードを使うと

Collections.addAllとArrays.asList

ジェネリックメソッドで可変長引数を使うと警告が出るでSetにデータを詰めるのに Collections.addAll を使ったんだけど、この手のもので、変数宣言と同時に使われる記法としては Arrays.asList を使うアイデアがある。
    private static final Set<String> fruits = new HashSet<>(Arrays.asList("1", "2", "3"));

Collections.addAllとArrays.asListのインターフェースは以下のようになっている。

public static <T> boolean addAll(Collection<? super T> c, T... elements)
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Collections.html#addAll-java.util.Collection-T...-

public static <T> List<T> asList(T... a)
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html#asList-T...-

[Java] ジェネリックメソッドで可変長引数を使うと警告が出る

ヒープ汚染

Javaで定数のSetを作ろうとして、以下のようにしたら、コンパイル時に警告が出てしまった。
    private static final Set<String> fruits = readOnlySet("apple", "banana", "orange");

    private static <T> Set<T> readOnlySet(T ... a) {
        Set<T> set = new HashSet<>(a.length);
        Collections.addAll(set, a);
        return Collections.unmodifiableSet(set);
    }
警告: [unchecked] パラメータ化された可変引数型Tからのヒープ汚染の可能性があります
    private static  Set readOnlySet(T ... a) {
                                                ^
  Tが型変数の場合:
    メソッド readOnlySet(T...)で宣言されているTはObjectを拡張します

[シェルスクリプト] [ -a ][ -o ]が POSIX では Obsolescent になっていた?

[ -a ]

シェルスクリプトで変数の値が0と100の間にあるかどうか、確認するときはこんなふうに書いたりする。

$ i=100
$ if [ $i -ge 0 -a $i -le 100 ] ;then echo "$i"; fi
100

testコマンドの条件の間に -a を入れることによって前後の条件式を and で結んでいる。

ところが。だ。

[シェルスクリプト] forループでのパス名展開

forループ

シェルスクリプトでファイルごとに同じ処理を実行するなんてことはよくあるね。
そんな場合はforループでパス名展開を使う。
例えば、*.log形式のファイルの中身をすべて出力したい場合は以下のようにする。
for f in *.log
do
  cat "$f"
done

※この場合、実はループなんか使う必要はなくて、cat *.log で十分だけど。