bash
Bash (Bourne-Again SHell) supported by the Free Software Foundation
Topics
コメントを利用してコマンドを再利用する方法
よく使うコマンドはaliasやシェルスクリプトの形で保存し再利用するのが王道かと思いますが、
「#」」を使ったコメントをコマンドの後ろに付けることで、コマンドを手軽に再利用する方法もあります。
例えば、以下のようにコマンドの後ろにコメントを付けておきます。
cd ~/foo/bar/baz #cfbb
すると今後は、このコマンドをそのまま再実行したいときには、C-rのあと#cfbbと入力してEnterで再実行できます。
ちなみに、コマンド全体が同じではなく、引数などの部分をそのときそのときで変えたい場合には、
先ほどの操作から続けて、C-eで行末に移動し、M-bとM-fで単語単位で移動して、M-dかC-wで単語単位で削除して、新たな内容を入力、といった形で対応することも出来はします。
もちろん、こういった操作がややこしい感じになるなら、素直にaliasかシェルスクリプトの活用の方が良いのではないかと思いますので、このコメントを利用した方法が活躍する場面は、全く同じコマンドを繰り返す場合だと思います。
同じコマンドをパパッと使い回す方法として便利なときがあるかもしれませんね。
それから、.bash_historyを後から見たり検索したりするなら、こういうコメントが残っていると実は便利なのかも。
パスワード入力でミスしたらC-uでたいていやり直せる
C-u、つまり、Ctrlキーを押しながらuキーを押す操作は、Bashやその背後にあるreadlineライブラリで、「カーソルから行頭までの切り取り」に割り当てられている。そのせいなのか、Unixシェルでパスワード入力中に失敗したときに、C-uを押してからパスワードを正しく再入力すれば、処理が通ることが多い、という小ネタです。
参考
unix-line-discard (C-u) ポイントから行頭までをキルします。 キルされたテキストはキルリング (kill-ring) に入ります。
https://ja.manpages.org/bash より
unix-line-discard (C-u) Kill backward from point to the beginning of the line. The killed text is saved on the kill-ring.
UNIXシステムの既存機構を活用したミニマルな通知システムの実装例です。 複数の通知元から任意の通知メッセージを受信し、それらをシェルプロンプトに表示できます。 個人利用の環境(趣味用途や開発用途など)への導入を想定しています。
設計思想
本システムの設計の核は「付け加えるものは最小限に、UNIXそのままの仕様と挙動を活かす」ことです。
以上の基本思想に合わせ、厳密な順序保証やマルチユーザ間の公平性よりも、単純性・可搬性・挙動の自明さを優先する設計とします。
システム仕様(外部仕様)
1. システム概要
ファイルシステムを介してユーザのシェル(Bash)のプロンプトに通知を表示する軽量な仕組みです。例えば、systemdユニットの実行失敗通知に利用できます。
2. 基本仕様
/var/lib/notify_inbox/ディレクトリを使用します。touchコマンドなどで、メッセージをファイル名とした空ファイルを作成します。3. 注意事項・制約
/(スラッシュ)はファイル名に使えません。.(ドット)から始まるファイル名については、通知と削除が行われるかどうかは、Bashのdotglobの設定に依存します。_や-の使用を推奨します。env LC_ALL=ja_JP.UTF-8 touch "/var/lib/notify_inbox/01_メッセージ")してください。0777)です。システム上の全ユーザが通知を見ることができます。実装コード一式
Step 1. 共有ディレクトリの設定(管理者権限)
systemdの機能を使って、起動時にディレクトリを作成し、適切な権限を与えます。
作成ファイル:
/etc/tmpfiles.d/notify_inbox.conf0777に設定し、スティッキービット(t)を意図的に付けていません。これにより、rootが作成した通知ファイルを一般ユーザが削除できるようになります。設定の反映:
Step 2. 通知先(受信側)の設定(一般ユーザ)
ユーザの
.bashrcに、プロンプト表示時に通知をチェックし、 通知があれば表示する処理を追加します。編集ファイル:
~/.bashrc設定の反映:
Step 3. 通知元(送信側)の設定例
systemdユニットファイルに通知コマンドを仕込みます。
例: バックアップサービスのユニット (
/etc/systemd/system/backup.service)解説:
ExecStopPost: サービス終了時(成功・失敗問わず)に実行されます。$EXIT_STATUS: systemdが終了時に設定する環境変数の一つです。0以外ならエラーと判断しています。確実な失敗通知にはOnFailure=の利用も検討してください。touch "...": ファイルを作るだけです。このファイル名がそのまま通知メッセージになります。Step 4. 動作確認
実際に通知が表示されるかテストします。
テスト用通知を作成(手動):
プロンプトを表示(Enterキーを押す): ターミナルで
Enterを押したタイミングで、プロンプトの前に以下のように表示されます。消去確認: もう一度
Enterを押し、通知が消えることを確認します。systemd経由のテスト(失敗シミュレーション):
ExecStart=/bin/falseと書いたダミーのユニットを作成してsystemctl startし、プロンプトにエラーが出るか確認してください。