試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Hotwireの内部コマンドを試す(UNIX系コマンド編)

一部のコマンドは、コマンドラインシェルの内部コマンドやcoreutilsに含まれる外部コマンドに機能が劣ったり使い勝手が違ったりするのだが、回避する方法はあり、今後のバージョンで改善される可能性もある。

  1. history
  2. lsとcd
  3. rmとゴミ箱
  4. mkdir
  5. cat
  6. mvとcp
  7. kill

history

履歴を表示する。-cオプションを付けても例外が出るだけで消すことはできない。
保存されているファイルは[ホームディレクトリ]/.hotwire/state/history.sqlite

lsとcd

ファイルとディレクトリのリストをグラフィカルに表示する。-aオプションを付けると、隠しファイル/ディレクトリも出る。

ls | filter [絞り込む文字列]

のようにfilterに渡すと、ファイル名からの絞り込みができる。それ以外の属性ではフィルタできない?

リストが出た状態でcdコマンドでディレクトリ移動をすると、リストも移動後のディレクトリのものになる。また、リストの内にディレクトリがある場合、GUIファイルマネージャのようにこれをダブルクリックすることで開くこともできる。ファイルをダブルクリックすると、関連付けされたアプリケーションで開く。リストの項目を右クリックして候補から選択することもできる。

ディレクトリの場合は、ファイルマネージャで開くことができる。ThunarXfce 4.4のGUIファイルマネージャ。
「cd -」で前のディレクトリ階層に戻ることはできないが、ウィンドウ左下の選択リストから過去にいた階層を選択することで、コマンドを打つことなく簡単に戻ったり進んだりできる。
なお、外部コマンドのlsを実行したい場合は、

sh ls [オプションやファイル/ディレクトリ名など...]

の形で実行する。

rmとゴミ箱

rmで消したファイルは[ホームディレクトリ]/.Trash/以下に移動される。これは[ホームディレクトリ]/.local/share/Trash/の下のものとは別に管理されることに注意。今後[ホームディレクトリ]/.local/share/Trash/に対応されることを期待。
デスクトップ環境のゴミ箱では、復元情報を含む.trashinfoファイルが生成されて使用されるため、[ホームディレクトリ]/.Trash/[ホームディレクトリ]/.local/share/Trash/files/に対するシンボリックリンクにしても、うまくいかない(復元不可)。
別の方法として、デスクトップにゴミ箱のアイコンがあれば、lsの結果からゴミ箱へドラッグ・アンド・ドロップを行うことで、デスクトップ環境のゴミ箱に入れることはできる。
なお、-fなど、オプションの指定はできない。オプションのつもりで付けた文字列はファイル名と解釈され、意図しない動作になる。

mkdir

使い方は/bin/mkdirと似ているが、オプションはなく、付けてもディレクトリ名と解釈されてしまう。例えば

mkdir -m 700 test

を実行すると、

  • -m
  • 700
  • test

という3つのディレクトリが作成される。

sh mkdir -m 700 test

とすれば外部コマンドのmkdirが実行され、意図した動作になる。
-mオプションは頻繁には使わなそうだが、存在しない(親)ディレクトリの中にディレクトリを作成する-pは付けたいことがあるかもしれない。しかしその心配はなく、

mkdir a/b/c

を実行すると

sh mkdir -p a/b/c

と同様に、aと、その中のbディレクトリを作成し、その中にcディレクトリを作成してくれるようになっている。
rmdirは内部コマンドにはないため、空のディレクトリを(外部コマンドの)rmdirで消してもゴミ箱には入らない。代わりにrmを使用することを想定しているのかもしれない。

cat

sh echo a | write a.txt
sh echo b | write b.txt
cat a.txt b.txt | write ab.txt

catで複数のファイルを結合する場合にはwriteに渡す(この後でab.txtの中身を見ると、結合されているのが分かる)。

ファイル内容を見るのにcatを使用することも、外部コマンドのcatと同様にできる。

cat ab.txt

mvとcp

基本的な使い方は同じ*1だが、上書き確認は行わないので注意。

mkdir test
mv a.txt b.txt test/

この後

mv ab.txt test/a.txt

を実行すると、test/a.txtの内容はab.txtの内容になってしまう。cpで上書きする場合も確認はされない。
また、シェルの展開を利用した

cp file{,.orig}

のような書き方はできない。

cp file file.orig
sh cp file{,.orig}

のどちらかで書く。

kill

kill [プロセスID]
sh killall [プロセス名]

killは内部コマンドでkillallは外部コマンドだが、どちらも感覚としては普通に使える。-KILLオプションなども付けられる。

*1:mvはパス名の変更(=名前変更もしくは移動)、cpはコピーで、どちらも、最後の引数にディレクトリを指定すると、そのディレクトリの中に、1つ前までの引数に指定したファイルやディレクトリを移動/コピーする