ふとした思いつきで、bashやzshのhistoryファイル(通常は環境変数のHISTFILEで指定したファイル)以外のファイルに、任意のフォーマットで実行したコマンドや実行時間、カレントディレクトリといった情報を記録できないだろうかと思ったので、試してみることにした。 今回はファイルに出力しているが、中の処理を書き換えれば実行履歴をDBに記録することもできると思うので、もし利用する場合は使い方に応じて適宜書き換えて貰えればいいだろう。

なお、この方法は単純にシェルの設定で対処しているだけの方法なので、ログの記録を強制できるというものではない(回避することは可能なはず)。 もし実行コマンド...


ごくごくたまにではあるのだが、GoogleやらBingの検索結果を一覧で取得することがあったのでそういうスクリプトをこさえて対応していた。 で、その実行結果で特定のドメインの検索結果からPATHごとにどのようなGETパラメータが使われているか集計したいということがあった。

具体的に言うと、例えば自分がよくお世話になっている上田先生のブログ(https://b.ueda.tech/)で検索かけて、その結果となるURLの一覧を抽出したとする(上田先生勝手にスミマセン…)。 その場合、以下のようなURLの一覧が取得されるのだが、そのPATHごとにどのようなGETパラメータをのパラメー...


pythonで簡単なCUIのツールを作っていたとき、pipでインストール時にbash/zshの補完ファイルも一緒にインストールさせたいというのがあったので、やり方について調べてみた。 で、結論としては以下のようなsetup.pyを作成すれば良さそうだということがわかった。


bash/zshで、入力中の内容を利用したカスタムキーバインドを作りたいということがあったので、備忘で残しておく。 (当たり前の話として、bash/zshどちらもキーバインドでfunctionを呼び出すことになるので、適当なfunctionを作ることになる)

以下、実際に動かしてるときの状態。 最初はzsh、次にbashに切り替えている。

ここでは、サンプルとしてカーソル位置から右側の文字列をダブルクオーテーションでくくるfunctionを作成する。


ターミナルでCUIを操作してたりすると、たまーにスピナー(棒がくるくる回ってるやつ)が表示されるコマンドがあったりする。その他にも、zshのtab補完のようなプロンプトの下でアニメーションする処理もある。 こういった、ターミナル上で文字を使って動く処理は、果たしてどうやって作ってるのだろう?と思ったので、簡単に作り方をまとめてみることにした。

1. 「\r(復帰コード)」を使う

1行のアニメーションであれば、一番手軽な方法。 bashやzshでは、\rキャリッジリターン(復帰コード) という制御コードを指定できる。この制御コードがあった場合、カーソルを行頭に戻すという処理が...


先日、 ssh接続先でローカルのbashrcを使うシェル芸 というのを書いたのだが、同じような方法を使えばvimrcやtmuxの設定ファイルも持っていけることに気づいた。 bashの--rcfileオプションのように、vimでも-uオプションで使用するvimrcファイルを指定できるので、bashと同じようにプロセス置換を利用してやればいい。

ただ、vimrcやtmux.confの場合、bashrcのように1回だけ読み込ませればそれでおしまいにはならない。 コマンドを実行するたびに設定ファイルを読み込むことになるので、起動してつなげっぱなしのbashとはすこしやり方が異なる。 vim...


プロセス置換を利用して鍵ファイルをsshコマンドに読ませられないか悩んでたときに教えてもらったのだけど、zshではプロセス置換で処理した出力結果を一時ファイルに保存して利用することができるらしい。

command ... =(command ...)


よくbashでコマンドの一覧を取得する際に利用するcompgenだが、残念ながらzshではデフォルトで有効になっていない。 で、その状態でzshでPATH配下にあるコマンドの一覧を取得したいといった場合、どうすればいいだろう。

zshでは、以下のコマンドでPATH配下にあるコマンドの一覧が取得できる。

whence -pm "*" # フルパス表示
print -rl -- $commands # フルパス表示
print -rl -- ${(ko)commands} # コマンドのみ表示

個人的にクライアントのシェルはzshを使ってて、右側のプロンプト(RPROMPT)に時刻表示をさせるようにしている。 で、この時刻をプロンプトが表示された時刻ではなく、常にシステム時刻が表示されるようにしたいなと思い調べてみたところ、以下のような内容を.zshrcに記述することで実現出来た。

setopt prompt_subst
TMOUT=1
TRAPALRM() {zle reset-prompt}

RPROMPT="%F{white} %D{%Y-%m-%d %H:%M:%S} %f"


最近snippetマネージャとしてpetを使うようになったのだけど、選択したsnippetをhistoryに残しておいてあとで確認、再利用できるようにしたいということがあったので関数で残しておくことにした。 特に難しい事はしておらず、「pet search」で得られたコマンド文字列をevalで実行して、かつprint -sでhistoryにも記録しているだけだ。


残念ながら、bashのブレース展開では「echo -e {あ..ん}」といった指定ではひらがなの一覧を出力できない(zshでは可能)。

blacknon@BS-PUB-UBUNTU-01:~$ bash -c 'echo -e {あ..ん}'
{あ..ん}
blacknon@BS-PUB-UBUNTU-01:~$ zsh -c 'echo -e {あ..ん}'
あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ...

コンソール上で特定の文字列をワンライナーで指定回数リピートさせたい(例えば、0を10回リピート等)ということがあったので、備忘で残しておく。 いくつか方法があるようなので、それぞれ分けて残しておく。

1. ブレース展開を利用する

真っ先に利用する方法として思いつくのはブレース展開だと思う。 ただ、以下のように普通にechoにくっつけて利用すると展開時にはスペース区切りになってしまう。

echo 0{,,,,,}
blacknon@BS-PUB-UBUNTU-01:~$ echo 0{,,,,,}
0 0 0 0 0 0

一応、前にブレース展開の出力区切り文字を変更するの...


コンソール上で、コマンドの結果を複数のファイルに出力したいことがある。 そういった場合、残念ながらbashの場合、リダイレクトだと複数のファイルへ同時に書き込むといったことは難しい。 じゃあどうすればいいのかというと、teeコマンドであれば複数ファイルを指定できるので、それで対応する。

コマンド | tee ファイル1 ファイル2 ファイル3 ...  >& /dev/null # 追記しない場合
コマンド | tee -a ファイル1 ファイル2 ファイル3 ...  >& /dev/null # 追記する場合
blacknon@BS-PUB-UBUNTU-01:~/test_dir...

Linuxでextglobを有効にして「指定したパターン以外のファイル」を指定する

仕事などで日常的にLinuxを利用しているのであれば、ほぼ大半の人がglobを利用した事があるだろう。
globという名前にはあまり馴染みが無いかもしれないが、以下のようにワイルドカードや複数のファイル名を指定したりする機能は使ったことがあるはずだ。

例)「/work」フォルダ配下のファイルを「/work2」に移動する

mv /work/* /work2/

例)「/work」フォルダ配下の「aaa.txt」「bbb.txt」のみを削除する

rm /work/{aaa.txt,bbb.txt}

このような指定方法を可能にしているのがglobという機能になる。
そんなg...


bash、ksh…Linuxで現在使用しているシェルを知る方法

Linuxを利用する際、大体はコンソールを利用すると思う。
その時に使っているシェルの種類は、shやbash、ksh、zshと多岐に渡る。今回は、現在使っているシェルの種類を調べる方法をまとめてみた。

1.コンソール上で確認する方法

コンソール上で確認するのは、以下のコマンドどちらかで対応出来る。

echo $0
ps -o args= -p "$$"

基本的に、この "echo $0"と"ps -o args= -p "$$""で確認が可能だ。
SolarisやHP-UX、Macでも有効なので、基本的にはこれだけ覚えていればいいだろう。

ただ、シェルスクリプトでは...