72 ポイント 投稿者 GN⁺ 2026-03-27 | 3件のコメント | WhatsAppで共有
  • さまざまな キーボードショートカットとコマンドの組み合わせを活用して、シェル環境での作業速度と効率を高める方法の整理
  • CTRL + W, U, K, Y などの基本ショートカットで行編集、CTRL + A/E, ALT + B/F でカーソル移動、reset でターミナルの復旧が可能
  • Bash と Zsh では CTRL + R でコマンド履歴を検索し、!!・!$・ESC+. などで直前のコマンドを再利用、Brace ExpansionGlobstar で反復作業を自動化
  • Process Substitutionteebg/disown などの高度な機能で、プロセス制御とログ管理を効率化
  • シェルを 道具箱のように使いこなせば生産性と集中力を高められ、ショートカットを一つずつ習慣化することが重要

ほぼすべてのシェルで動作する基本ショートカットと機能

  • CTRL + W, U, K, Y** の組み合わせは、カーソル位置を基準に単語または行の前後をすばやく削除・復元する**行編集ショートカット

    • CTRL + W はカーソル前の単語を削除
    • CTRL + U はカーソル位置から行頭までを切り取り、CTRL + Y で貼り付け可能
    • CTRL + K はカーソル位置から行末までを切り取り
    • CTRL + A / E は行頭と行末へ移動し、ALT + B / F は単語単位で前後に移動
    • ほとんどのターミナルで標準で有効になっており、Mac では Option キーを Meta に設定する必要がある
    • reset または stty sane コマンドは、バイナリファイルを誤って出力してターミナル表示が壊れたときの復旧に使える
    • 画面が壊れていても入力は可能なので、reset と入力して Enter を押せば復元できる
    • CTRL + C / D はそれぞれコマンドの中断と EOF(ファイル終端)シグナルの送信
    • CTRL + D は空のプロンプトで押すとシェルを終了する
    • CTRL + Lclear コマンドと同じく画面を即座に整理する
    • 現在入力中のコマンドを保ったまま、プロンプトを画面上部へ移動する
    • cd - は直前のディレクトリへすぐ移動でき、pushd / popd はディレクトリスタックを使って複数の場所を行き来しながら作業できる
    • > file.txt はファイルを削除せずに空にするため、権限と所有権を維持できる
    • $_ 変数は 直前のコマンドの最後の引数を再利用する
    • 例: mkdir -p /path/newdir && cd "$_"
    • set -e, set -u はスクリプトの安全性を高めるオプション
    • set -e はエラー発生時に即座に終了する
    • set -u は未定義の変数を参照した場合にエラーとして扱う
    • set -euo pipefail の組み合わせは、より強力な保護機能を提供する

Bash と Zsh での高度なショートカットと機能

  • CTRL + R はコマンド履歴に対して 逆方向インクリメンタル検索を行う
    • キーワードを入力すると、過去のコマンドを即座に見つけて再利用できる
  • !! は直前のコマンド全体を再実行する
    • sudo !! で直前のコマンドを管理者権限で再実行できる
  • CTRL + X, CTRL + E は現在入力中のコマンドを 既定のエディタ(Vim、Nano など) で開き、修正後に実行する
    • Zsh では別途設定が必要
    • fc コマンドは、以前のコマンドを $EDITOR で開いて修正する伝統的な方法
  • ESC + . または ALT + . は直前のコマンドの最後の引数をカーソル位置に挿入する
    • 繰り返し入力すると、さらに前のコマンドの引数まで順にたどれる
    • !$ は同じ機能を非対話的に実行する
  • Brace Expansion** は反復入力を減らす**波括弧展開機能

    • cp pf.conf{,.bak}cp pf.conf pf.conf.bak
    • mv filename.{txt,md}mv filename.txt filename.md
    • mkdir -p project/{src,tests,docs} で複数のディレクトリを作成
    • Process Substitution <(command) はコマンド出力をファイルのように扱う
    • 例: diff <(sort file1.txt) <(sort file2.txt) で一時ファイルなしに比較
    • Globstar(**) はサブディレクトリまで再帰的にファイルを探索する
    • Bash では shopt -s globstar で有効化し、Zsh では標準で有効
    • 例: ls **/*.js ですべてのサブフォルダ内の JS ファイルを探索
  • CTRL + Z**,** bg**,** disown** の組み合わせは、プロセスをバックグラウンド実行してシェルから切り離す

    • CTRL + Z で一時停止 → bg でバックグラウンド実行 → disown でシェルから切り離し
    • SSH を終了した後もプロセスを維持できる
    • command |& tee file.log標準出力(stdout)標準エラー(stderr) を同時にパイプへ流す
    • |&2>&1 | の短縮形
    • tee を使うことで、画面出力とログ保存を同時に行える

シェル活用の重要なアドバイス

  • シェルは 道具箱であり、使いこなせば生産性を大きく高められる
  • すべてのショートカットを一度に覚えるより、一つずつ習慣化するほうが効果的
  • 反復入力と不要なタイピングを減らして、作業フローを単純化できる
  • 慣れてくれば、ターミナルはもはや障害物ではなく、自分の作業空間になる

3件のコメント

 
phoon 2026-03-30

ほとんど全部Emacsのキーバインドなのに、Emacs自体の話はほとんど出てこず、最近はちょっとしたTipsのようにたくさん共有されているのを見ると、隔世の感があります。readlineライブラリがそっくりそのままEmacsキーバインドを実装しているんですよね。IDEにほぼ全面移行してからもう20年近く経つ気がしますが、いまだにgdbtuiみたいなものを使っていた化石の立場からすると、やはり良いものは死なないのだと思います。

 
GN⁺ 2026-03-27
Hacker Newsのコメント
  • 人生が変わったと感じたのは、上矢印キーをリマップした瞬間だった
    これで全コマンドを順番にたどるのではなく、すでに入力した文字で始まるコマンドだけを探せる
    たとえば tar - と入力して上矢印を押すと、以前使った tar のオプションがすぐ出てくる
    zsh では次のように設定する

    bindkey "^[OA" up-line-or-beginning-search # Up  
    bindkey "^[OB" down-line-or-beginning-search # Down
    
    • CTRL+r を使い始めると、上矢印は二度と使わなくなる
    • 完全なゲームチェンジャーだと思う。bash でも同様にするなら .inputrc に次を追加する
      "\e[A":history-search-backward  
      "\e[B":history-search-forward
      
    • fish shell ではこれがデフォルト動作。入力した単語を基準に上下矢印でコマンドを探せて、alt+上下で引数だけをたどることもできる
    • .inputrc でも同じように実現できる
    • 自分は上下矢印はそのままにして、代わりに ctrl+p と ctrl+n をこの方式にしている
  • ターミナルで vim-mode を有効にするとかなり快適になる
    3語前でミスした? 3bcw で終わり
    行全体の削除は cc、複雑な修正は v で (neo)vim にそのまま開ける
    すでに (neo)vim を使っているなら、新しいショートカットを覚える必要がないのが最高

    • 昔の Emacs マニュアルの一節を思い出した。複雑なコマンドよりマウス設定を勧めたい
    • 20年以上 (n)vim を使ってきたが、shell の vi-mode は嫌い。複雑なコマンドが必要なときは ctrl-x+e で neovim で開いて使うのが良い折衷案
    • 自分も vim はよく使うが shell では使わない。その代わり Emacs風ショートカット(ctrl-a、ctrl-e など)を macOS 全体で使っている。vim が insert モードで emacs バインドをサポートしてくれたらいいのにと思う
    • 「readline vi-mode」という機能名を初めて知った。もっと調べてみたい
    • なぜ emacs モードがデフォルトなのか理解できない。新しい shell を開いたら最初に set -o vi を打つ
  • ある人が \# というスクリプトを PATH に入れて、パイプラインの一部をコメントアウトできるようにしていたのが印象的だった

    #!/bin/sh
    cat
    
    • 自分も似たトリックを使う。~/bin/noglob
      #!/bin/sh
      $*
      
      こうして bash から zsh スクリプトを呼ぶときの noglob の衝突を避けている
    • 自分は括弧コメントを使う。スクリプトの文書化には良いが、対話シェルでは面倒。それでも創造的なコメント方法で面白い
    • mycmd1 #| mycmd2 と比べてどんな利点があるのか気になる
    • これは本当に便利そうなので、自分の $PATH に追加するつもり
  • CTRL+W は普通は直前の空白まで削除するので、/var/log/nginx/ 全体を消してしまう
    Alt+Backspace は英字以外の文字の直前まで削除する
    ただし、ブラウザのタブを閉じるショートカットと衝突するので注意

    • Firefox v147 からショートカット再定義機能が追加された。関連リンク
    • macOS では GUI ショートカットとターミナルショートカットが分かれているので、こういう問題はない。⌘C、⌘W などもターミナルでそのまま動く
    • 自分の環境(fish + Alacritty)では逆に動く。それでも Ctrl-Shift-T で閉じたタブを復元できるので助かる
    • $WORDCHARS 設定から / を外せば望む動作になる(参考リンク
    • Ctrl-Shift-T でタブをすぐ復元できる
  • fzf shell integration で履歴検索を強化するのを勧めたい
    デモ動画 / 公式ドキュメント

  • よく使うトリックが一つある
    長いコマンドを打っている途中で別のことを先にやる必要が出たとき、Ctrl-C でキャンセルせず コメントアウトして実行して履歴に残す

    $ long_command  
    $ #long_command  
    $ stuff_1  
    $ stuff_2  
    $ #long_command  
    $ long_command
    
    • zsh では "push-line-or-edit" バインドで可能で、bash では C-u の後に C-y で似たことができる
    • もっと簡単な方法は ctrl-u で現在の行を保存して空にし、ctrl-y で貼り戻すこと。zsh では alt-q でこの流れを自動化できる
    • bash では alt-shift-3 で現在のコマンドの先頭に # を付けて新しい行へ移れる
  • LLM風のタイトルはいまひとつだが、いくつかのヒントは役に立ちそうなので試してみるつもり
    brace expansion がタブ補完とうまく噛み合わないのは残念。最後のトークンの複製やファイル拡張子の削除のような機能がもっとあるといいのに

    • 文章の文体自体も LLM っぽさがある。たとえば “The shell is a toolbox, not an obstacle course.” のような文
    • PowerShell にも readline モード があり、WSL と併用するときの切り替え負担が減る
    • readline は bash の一部のように動くので、こうしたヒントを shell の機能と呼んでも差し支えないと思う
  • zsh の設定で、特定のコマンドを履歴から除外する関数を使っている
    たとえば --force のような危険なコマンドを履歴に残さないようにする

    function zshaddhistory() {
      emulate -L zsh
      if ! [[ "$1" =~ "(^ |--force|whatever)" ]] ; then
        print -sr -- "${1%%$'\n'}"
        fc -p
      else
        return 1
      fi
    }
    
    • 自分も似たように、記録したくないコマンドには先頭に空白を付ける aliasを作ってある
      unhist () { alias $1=" $1"; }
      unhist unhist
      unhist fzf
      unhist rghist
      
  • zsh で グローバル alias の自動展開を実装するスニペットを使っている
    たとえば alias -G G='rg -s' と設定すると、command | G と入力したとき自動的に command | rg -s に展開される
    space 入力時に自動展開され、\alias と入力すれば展開をスキップできる

  • .bashrc に自作した「deep cd」関数がある
    引数でもらった文字列を含む最初のディレクトリへ自動で移動する

    dcd() {
      [ -z "$1" ] && return
      local dir
      dir=$(find . -type d -path "*$1*" -print -quit 2>/dev/null)
      [ -n "$dir" ] && cd "$dir"
    }
    

    最初は遅いかと思ったが、思った以上によく使っている

    • autojump の jc や z、fzf のような賢い cd ツールもあわせて見るとよい
 
phoon 2026-03-30

上向き矢印キーのリマップは、Emacsユーザーなら普通に c-r でやる。チューニングの果ては純正。