makeでMakefileのあるディレクトリのパスを得るMakefileが配置されているディレクトリのパスを得るにはどうすればよいのか。オプションで異なるディレクトリのMakefileを読み込んだ時にはうまくいかない(CURDIRの値はカレントディレクトリなので)。$(MAKEFILE_LIST))))を使うという方法が紹介されていた。MAKEFILE_LISTという変数にはMakefileとそこからincludeされたファイルの名前が設定されているようだ。文字の色を変えるスクリプト(2)11年前にメモした文字の色を変えるスクリプトを使いたくなった。オプションを付ければ解決する模様。"s/${1}/^[[43m${1}^[[0m/g"と微修正(「^[」の部分はエスケープ文字を直接入力する必要がある)。あと、このスクリプトは指定文字列以外に「${1}」という文字列の色も変えてしまうことに気付いた。なんでこういう動作になるのかな。2047に従ってエンコードする必要があるようである。Pythonではこのエンコード処理をemail.headerモジュールで行うことができる。=?iso-2022-jp?b?GyRCJCIkIiQiJCIkIiQiJCIkIiQiJCIkIiQiJCIbKEI=?=このように、Headerオブジェクトを生成すればエンコードができる。header_nameは指定しなくても問題ないが、指定するとエンコード後の最初の行の文字数をヘッダ名の分(上の例だと「Subject:」)だけ減らしてくれる。上の例ではcharsetとして"iso-2022-jp"を指定しているが、この場合もしエンコード対象文字列にiso-2022-jpでエンコードできない文字が含まれていると自動的にutf-8でエンコードしてくれて気が利いている。Bashにおけるリダイレクトおれはリダイレクトを雰囲気で使っている。混乱するので気になる所を調べてメモしておく。使用するシェルはBashとする。ファイルディスクリプタリダイレクトを理解するにはファイルディスクリプタを理解する必要があるだろう。入出力先を持つ非負の整数でどうだろうか。入出力先はファイルや画面、キーボードなどになる。プロセスは生成されたときに0,1,2という3つのファイルディスクリプタを持っている。これらが入出力先として何を持っているのかは親プロセスが決めることであり、プロセス自身は関知しない。新しいファイルディスクリプタを作成しその入出力先を設定する。既存のファイルディスクリプタの入出力先を変更する。ファイルディスクリプタを破棄する。理解すればいいと思う。大事な点として、リダイレクトによるファイルディスクリプタの操作は対象とするコマンドに対してのみ行われ、コマンドを実行するシェル自体には影響がないということがある。>/tmp/oreoreはファイルディスクリプタ1の出力先を変更するが、この変更はechoコマンドのみに作用し、この後に実行するコマンドには影響しない。例外はコマンドが「exec」だった場合で、それについては別にメモする(メモした)。Bashのリダイレクトの記法はたくさんあるが、以下ではその中のいくつかについてだけメモする。[n]>wordよく使う、ファイルへのリダイレクトである。[n]にはファイルディスクリプタ(省略すると1になる)、wordにはファイルパスを指定し、これにより次が行われる。ファイルwordがないなら作成する。ファイルディスクリプタ[n]がないなら作成する。ファイルディスクリプタ[n]の出力先としてファイルwordを設定する。echoコマンドはファイルディスクリプタ1へ出力を行うコマンドであり、ファイルディスクリプタ5へは出力を行わないからである。wordがファイルディスクリプタの場合は次が行われる。ファイルディスクリプタ[n]がないなら作成する。ファイルディスクリプタ[n]の出力先として「ファイルディスクリプタwordの出力先」を設定する。ファイルディスクリプタ[n]を破棄する。5>/tmp/oreoreとしても同じ結果になる。>&-とするとファイルディスクリプタ1が破棄されるのでechoコマンドはエラーになる。両方を指定した場合は次が行われる。ファイルディスクリプタ[n]がないなら作成する。ファイルディスクリプタ[n]の出力先として「ファイルディスクリプタdigitの出力先」を設定する。ファイルディスクリプタdigitを破棄する。ファイルディスクリプタdigitをもう使わない場合はこちらの記法の方がいいのだろうけど、あまり使われない気がする。変えるとファイルディスクリプタへ出力先ではなく入力先を設定することになる。出力のリダイレクトにはもう一つ記法があるのでそれもメモしておく。>&wordwordにはファイルパスを指定する。これにより次が行われる。ファイルwordがないなら作成する。ファイルディスクリプタ1または2がないなら作成する。ファイルディスクリプタ1と2の出力先としてファイルwordを設定する。この記法はファイルディスクリプタ1と2の両方をファイルにリダイレクトするときに使う。BashのexecコマンドBashにはexecという組み込みコマンドがある。