Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題113

問題113 カレントディレクトリの調査

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

シェルスクリプトの中でランダムにカレントディレクトリを移動する処理のあとsleepがバックグラウンドで行われたとき、結局sleepがどこのディレクトリで行われたのかを特定する問題だった。プロンプトの左側を見ればわかる話じゃないかと思ったがよくよく考えたらシェルスクリプトはサブシェルを生成してその中で処理を行うわけで、それだと自分の端末からはどこへ行ったのか見えるわけがなかった。

問題のシェルスクリプトを実行すると、最後に直前にバックグラウンドで実行されたコマンドのプロセスIDを出力するのでそれを手掛かりにカレントディレクトリを特定する。/proc以下にはプロセスIDに対応したディレクトリがあり、そのさらに下にはcwdというファイルがある。このファイルがカレントディレクトリへのシンボリックリンクになっているのでls-lで詳細を見ればどこで実行されたのかがわかる。

結局解答例は

ls -l /proc/(プロセスID)/cwd

となる。