トップページ

Unixの基本操作

はじめに

ここではUnixの基本操作を説明します。UnixについてはUnixの基本事項を参照してください。

Windows上でUnixを使用するには次のような方法があります。

WSL(Windows Subsystem for Linux) Windows標準のLinuxエミュレータ。高速・軽量ですぐに使用できる。
MSYS2 UnixのツールチェーンでWindowsアプリケーションを開発するためのコンパクトなUnix環境。
VirtualBox/VMware WindowsやUnix系のOSを動かせるPCエミュレータ。上の方法と比べると若干重い。

いちばん手軽な方法はWSLです。デスクトップ環境を使用したいのであればVirtualBox/VMwareを選択します。ここではWSLを使用します。

ディストリビューションのインストール

WSLはWindowsターミナルで使用します。スタートメニューからWindowsターミナルを起動してください。

WSLにインストールできるディストリビューションをリストします。

# wsl -l -o

ここではarchlinuxをインストールすることにします。

# wsl --install archlinux

ディストリビューションを起動するには以下のようにします。ディストリビューションはターミナルのメニューからも起動できます。

# wsl -d archlinux

ディストリビューションを削除するには以下のようにします。ディストリビューションをリセットしたいなら削除してから再度インストールします。

# wsl --unregister archlinux

ディストリビューションはコマンドwslで管理します。コマンドwslの使い方を確認するには以下のようにします。

# wsl --help

コマンドラインの基本操作

ターミナルのコマンドラインは以下のようなキー操作で編集します。

Ctrl+j もしくは Ctrl+m もしくは Enter 入力したコマンドを実行
Ctrl+h もしくは BackSpace カーソル位置の手前の文字を削除
Ctrl+d もしくは Del カーソル位置の文字を削除
Ctrl+k カーソル位置から行末の文字列を削除
Ctrl+u カーソル位置から行頭の文字列を削除
Ctrl+f もしくは → カーソルを右に移動
Ctrl+b もしくは ← カーソルを左に移動
Ctrl+e カーソルを行末に移動
Ctrl+a カーソルを行頭に移動
Ctrl+i もしくは Tab コマンド名・ファイル名・パス名を補完
Ctrl+i+i もしくは Tab Tab 補完候補を表示
Ctrl+n もしくは ↓ 実行したコマンドの履歴を順方向に縦覧
Ctrl+p もしくは ↑ 実行したコマンドの履歴を逆方向に縦覧
Ctrl+s 実行したコマンドの履歴を順方向に検索
Ctrl+r 実行したコマンドの履歴を逆方向に検索
Ctrl+g コマンドの検索を終了
Ctrl+[+. もしくは Alt+. もしくは Esc+. 直前に実行したコマンドの最後の単語を挿入

ターミナルの画面出力を消去するにはCtrl+lを押すか、コマンドclearを入力します。

ディストリビューションの初期設定

スクリプトは実行したいコマンドを記述したテキストファイルです。以下のスクリプトをコメントの指示にしたがって実行してください。このスクリプトを実行すれば初期設定が終了します。インストールするパッケージや設定ファイルの内容は必要に応じて変更してください。

init-arch-wsl.sh
#!/bin/bash

# Arch Linux on WSL の初期設定スクリプト
# これを root で実行してください。
# 使い方:
# 1. # chmod +x init-arch-wsl.sh
# 2. # ./init-arch-wsl.sh | tee init-arch-wsl.log

set -euo pipefail

# === 設定(必要に応じて変更) ===
NEW_USER="user"               # ここを作成したいユーザー名に変更
NEW_USER_SHELL="/bin/bash"    # /bin/bash または /bin/zsh など
LOCALE="ja_JP.UTF-8"
TIMEZONE="Asia/Tokyo"
MIRROR_COUNTRY="Japan"
AUR_HELPER="yay"

# === root チェック ===
if [ "$(id -u)" -ne 0 ]; then
  echo "このスクリプトは root で実行してください。"
  exit 1
else
  echo "root のパスワードを設定してください:"
  passwd root
fi

# === pacman.conf の設定 ===
if ! grep -q '^Color' /etc/pacman.conf; then
	sed -i 's/^# *Color/Color/' /etc/pacman.conf
fi
if grep -q '^NoProgressBar' /etc/pacman.conf; then
	sed -i 's/^NoProgressBar/#NoProgressBar\nILoveCandy/' /etc/pacman.conf
fi

# === 基本アップデート ===
echo "システムを最新にしています..."
pacman -Syu --noconfirm
echo "システムを最新にしました。"

# === 必須パッケージ ===
echo "必須パッケージをインストールしています..."
pacman -S --needed --noconfirm base-devel git neovim networkmanager iproute2 reflector sudo openssh
echo "必須パッケージをインストールしました。"

# === ユーザー作成 ===
if ! id "${NEW_USER}" >/dev/null 2>&1; then
  useradd -m -G wheel -s "${NEW_USER_SHELL}" "${NEW_USER}"
  echo "ユーザー ${NEW_USER} を作成しました。パスワードを設定してください:"
  passwd "${NEW_USER}"
else
  echo "ユーザー ${NEW_USER} は既に存在します。"
fi

# wheel グループの sudo 設定を有効化
if ! grep -q '^%wheel' /etc/sudoers; then
  sed -i 's/^# *%wheel/%wheel/' /etc/sudoers
  echo "wheel グループの sudo 権限を有効化しました。"
fi
visudo -cf /etc/sudoers

# === ミラー最適化 ===
if pacman -Qi reflector >/dev/null 2>&1; then
  echo "ミラーリストを最適化しています..."
  reflector --country "${MIRROR_COUNTRY}" --age 12 --protocol https --sort rate --save /etc/pacman.d/mirrorlist --verbose 2>&1
  pacman -Syy --noconfirm
  echo "ミラーリストを更新しました。"
fi

# === ロケール設定 ===
if ! grep -q "^${LOCALE}" /etc/locale.gen; then
  sed -i "s/^# *\(${LOCALE} UTF-8\)/\1/" /etc/locale.gen
  echo "ロケール ${LOCALE} を有効化しました。"
fi
locale-gen
echo "LANG=${LOCALE}" > /etc/locale.conf
echo "ロケールを ${LOCALE} に設定しました。"

# === タイムゾーン設定 ===
if [ -f "/usr/share/zoneinfo/${TIMEZONE}" ]; then
  cp -a /etc/localtime /etc/localtime.bak 2>/dev/null
  ln -sf "/usr/share/zoneinfo/${TIMEZONE}" /etc/localtime
  echo "タイムゾーンを ${TIMEZONE} に設定しました。"
else
  echo "警告: タイムゾーン '${TIMEZONE}' が存在しません。" >&2
fi
# hwclock は WSL 環境では失敗することがあるが無害
if command -v hwclock >/dev/null 2>&1; then
  hwclock --systohc
  echo "システムクロックをハードウェアクロックに同期しました。"
fi

# === シェル (zsh) をデフォルトにする場合、ユーザーのシェルを変更 ===
if [ "${NEW_USER_SHELL}" = "/bin/zsh" ]; then
  pacman -S --needed --noconfirm zsh
  chsh -s /bin/zsh "${NEW_USER}"
  echo "ユーザー ${NEW_USER} のデフォルトシェルを zsh に変更しました。"
fi

# === AUR ヘルパー (yay) のインストール ===
if [ "${AUR_HELPER}" = "yay" ]; then
  echo "AUR ヘルパー ${AUR_HELPER} をインストールしています..."
  su - "${NEW_USER}" -c 'bash -lc "
    set -e
    cd /tmp
    if [ ! -d yay ]; then
      git clone https://aur.archlinux.org/yay.git
      cd yay
      makepkg -si --noconfirm
      cd ..
      rm -rf yay
    fi
  "'
  echo "AUR ヘルパー ${AUR_HELPER} をインストールしました。"
fi

# === SSH 鍵作成(ユーザーとして) ===
su - "${NEW_USER}" -c 'bash -lc "
  if [ ! -f ~/.ssh/id_ed25519 ]; then
    mkdir -p ~/.ssh
    ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N \"\" -C \"${NEW_USER}@wsl\"
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/id_ed25519
    echo \"SSH の鍵を作成しました: ~/.ssh/id_ed25519\"
  fi
"'

# === パッケージのインストール ===
echo "必要なパッケージをインストールしています..."
pacman -S --needed --noconfirm noto-fonts-cjk man-db man-pages groff tree bat less msedit trash-cli ripgrep fd rsync htop wget lftp neomutt w3m perl-uri feh viu mupdf mpv unzip nodejs python
su - "${NEW_USER}" -c 'bash -lc "
yay -S --needed --noconfirm man-pages-ja
"'
echo "必要なパッケージをインストールしました。"

# === マニュアルデータベースの更新 ===
echo "マニュアルデータベースを更新しています..."
mandb
echo "マニュアルデータベースを更新しました。"

# === ユーザーの設定ファイルを配置 ===
cat <<'EOF' >> ~/.bashrc

if [ -f ~/.settings ]; then
    source ~/.settings
fi
if [ -f ~/.aliases ]; then
    source ~/.aliases
fi
if [ -f ~/.functions ]; then
    source ~/.functions
fi
EOF
cat <<'EOF' > ~/.settings
export EDITOR='nvim'
export LANG='ja_JP.UTF-8'
export PAGER='bat'
export MANPAGER='less -R'

# 履歴設定
export HISTFILE=~/.bash_history
export HISTSIZE=500                     # セッション中に保持する件数
export HISTFILESIZE=2000                # ファイルに保存する最大件数
export HISTCONTROL=ignoredups:erasedups # 重複するコマンドを履歴から削除
export HISTTIMEFORMAT='%F %T '          # 例: 2026-03-13 12:34:56
EOF
cat <<'EOF' > ~/.aliases
alias a='alias'
alias c='clear'
alias e='nvim'
alias feh='feh --geometry 800x600 --image-bg 000000 --scale-down'
alias h='cd ~'
alias hi='history'
alias j='bat'

# 再ログイン
alias relogin='exec $SHELL --login'
alias re='relogin'

# ファイル・ディレクトリ表示
alias ls='ls -FH --color=auto --group-directories-first'
alias la='ls -A'
alias ll='ls -Alh --time-style=long-iso'
alias l='clear && ll'

# ファイル・ディレクトリ操作
alias -- -='cd -'
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias cp='cp -piv'
alias mv='mv -iv'
alias rm='trash -v'         # ゴミ箱に移動
alias tl='trash-list'       # ゴミ箱の内容を表示
alias tr='trash-restore'    # ゴミ箱から復元
# alias rm='rm -iv'
# alias rmrf='rm -rf'         # 注意して使用
alias mkdir='mkdir -v'
alias mkdirp='mkdir -p'     # 親ディレクトリも作成
# alias rmdir='rmdir -v'
alias rename='rename -iv'
alias chmod='chmod -v'
alias chown='chown -v'

# 検索
alias g='grep --color=auto'
alias eg='grep -E'
alias fg='grep -F'

# 差分表示
alias diff='git diff --no-index --'

# プロセス管理
alias top='htop'

# yay
alias yy='yay'
alias yyu='yay -Syu'    # システム全体を更新
alias yyU='yay -Syyu'   # パッケージデータベースを強制更新してシステム全体を更新
alias yyi='yay -S'      # パッケージインストール
alias yys='yay -Ss'     # パッケージ検索
alias yyv='yay -Si'     # パッケージ情報表示
alias yyV='yay -Sii'    # パッケージ情報表示(詳細)
alias yyq='yay -Qs'     # インストール済みパッケージから検索
alias yyl='yay -Qi'     # インストール済みパッケージの情報表示
alias yyL='yay -Qe'     # 明示的にインストールされたパッケージのリスト表示
alias yylf='yay -Ql'    # パッケージのファイルリスト表示
alias yylo='yay -Qdt'   # 孤立したパッケージのリスト表示
alias yyro='yylo && yay -Rns $(yay -Qtdq)'  # 孤立したパッケージの削除
alias yyr='yay -Rns'    # パッケージ削除と不要依存の削除
alias yyc='yay -Scc'    # 全キャッシュ削除
EOF
cat <<'EOF' > ~/.functions
# w3m-search: w3m で各種検索エンジンを開く関数
# 使い方:
#   w3m-search "検索語"     # DuckDuckGo
#   w3m-search "検索語" w   # Wikipedia
#   w3m-search "検索語" l   # ロングマン英和
#   w3m-search "検索語" k   # コトバンク
#   w3m-search "検索語" e   # e-Words
#
# 例: w3m-search "artificial intelligence" w
#
w3m-search() {
  local query engine url enc_q
  if [ $# -lt 1 ]; then
    echo "使い方: w3m-search \"検索語\" [w|l|k|e]" >&2
    return 2
  fi

  query="$1"
  engine="${2:-ddg}"

  # URL エンコード(簡易。UTF-8 環境前提)
  enc_q=$(printf '%s' "$query" | perl -MURI::Escape -ne 'chomp; print uri_escape($_), "\n"')

  case "$engine" in
    ddg|duckduckgo)
      # DuckDuckGo
      url="https://duckduckgo.com/?q=${enc_q}"
      ;;
    w|wiki|wikipedia)
      # Wikipedia(言語は自動検出せず日本語優先)
      if printf '%s' "$query" | grep -qP '[\x{3040}-\x{30FF}\x{4E00}-\x{9FFF}]'; then
        url="https://ja.wikipedia.org/wiki/${enc_q}"
      else
        url="https://en.wikipedia.org/wiki/${enc_q}"
      fi
      ;;
    l|longman)
      # ロングマン英和辞典
      url="https://www.ldoceonline.com/jp/dictionary/english-japanese/${enc_q}"
      ;;
    k|kotobank)
      # コトバンク
      url="https://kotobank.jp/word/${enc_q}"
      ;;
    e|ewords)
      # e-Words
      url="https://e-words.jp/w/${enc_q}.html"
      ;;
    *)
      echo "不明なエンジンです: ${engine}" >&2
      echo "サポートされているのは: ddg, wiki, longman, kotobank, ewords" >&2
      return 3
      ;;
  esac

  # w3m を起動(-I utf-8 -O utf-8 は必要に応じて)
  w3m -I utf-8 -O utf-8 "$url"
}
EOF
mkdir -vp ~/.config/nvim/vimrc.d
cat <<'EOF' > ~/.config/nvim/init.vim
" ディレクトリを指定(必要なら変更)
" let s:confdir = expand('~/.vim/vimrc.d')
let s:confdir = expand('~/.config/nvim/vimrc.d')

" 存在するファイルを順に読み込む
if isdirectory(s:confdir)
  for fname in split(globpath(s:confdir, '*.vim'), '\n')
    execute 'source' fname
  endfor
endif
EOF
cat <<'EOF' > ~/.config/nvim/vimrc.d/00-settings.vim
syntax enable       " シンタックスハイライト
filetype indent on  " ファイルタイプごとのインデント
filetype plugin on  " ファイルタイプごとのプラグイン

" 基本動作
set autochdir                   " カレントディレクトリを自動的に移動
set backspace=indent,eol,start  " バックスペースの動作を拡張
set clipboard=unnamedplus       " システムクリップボード共有(必要なら)
set hidden                      " バッファを閉じずに切り替え可能
set mouse=a                     " マウスを有効化
set nocompatible                " Vi互換モード無効

" インターフェイス
set background=dark " ダークテーマ(好みで)
set cmdheight=2     " コマンドラインの高さ
set laststatus=2    " 常にステータスライン表示
set number          " 行番号
" set relativenumber  " 相対行番号(好みで)
" set ruler           " ルーラー表示(行番号の右にカーソル位置などを表示)
set shiftround      " インデントをタブ幅の倍数に丸める
set showcmd         " コマンド入力を表示
set showmode        " モード表示(インサート、ビジュアルなど)
set signcolumn=yes  " 常にシグナルカラムを表示(エラーなどのアイコン用)
set termguicolors   " カラースキームを有効に(端末対応なら)
set wildmenu        " コマンドライン補完をメニュー表示

" 編集
set autoindent      " 自動インデント
" set cursorcolumn    " カーソル列をハイライト
set cursorline      " カーソル行をハイライト
set expandtab       " タブをスペースに変換
set nowrap          " 自動改行を無効(好みで)
set scrolloff=999   " カーソル位置を常に画面中央に表示
set shiftwidth=4    " インデントの幅
set showmatch       " 対応する括弧を強調
set smartindent     " スマートインデント
set softtabstop=4   " タブキーのスペース数
set tabstop=4       " タブの幅
" set textwidth=78    " テキストの幅(自動改行の位置)
" set wrap            " 行の折り返し(好みで)

" 検索
set hlsearch    " 検索結果ハイライト
set incsearch   " インクリメンタル検索
set ignorecase  " 大文字小文字を区別しない検索
set smartcase   " 大文字を含む検索語は大文字小文字を区別

" ファイル管理
set backup                  " バックアップファイルを作成
set backupdir=~/.vim/backup " バックアップファイルの保存場所
set swapfile                " スワップファイルを作成
set directory=~/.vim/swap   " スワップファイルの保存場所
set undofile                " アンドゥファイルを作成
set undodir=~/.vim/undo     " アンドゥファイルの保存場所
set writebackup             " 上書き保存前にバックアップファイルを作成

" パフォーマンス
set updatetime=300  " CursorHoldイベントの発火時間を短縮
set lazyredraw      " 画面更新を最小限にして高速化
EOF
cat <<'EOF' > ~/.config/nvim/vimrc.d/10-mappings.vim
" インサートモードでjjを押すとノーマルモードに戻る
inoremap jj <ESC>

" リーダーキー
let mapleader=","

" 行移動の改善
nnoremap <leader>e :NERDTreeToggle<CR>
nnoremap <C-p> :Files<CR>       " fzf
nnoremap <leader>gs :Gstatus<CR>

" バッファ移動(Ctrl+Tab / Ctrl+Shift+Tab)
noremap <C-Tab> :bn<CR>
noremap <C-S-Tab> :bp<CR>

" ウィンドウ移動(Ctrl+h/j/k/l)
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
EOF
cat <<'EOF' > ~/.config/nvim/vimrc.d/20-plugins.vim
" vim-plug のヘッダ
call plug#begin('~/.vim/plugged')
Plug 'vim-jp/nvimdoc-ja'
Plug 'tpope/vim-sensible'
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Plug 'preservim/nerdtree'       " ファイルツリー(好みで)
Plug 'tpope/vim-fugitive'       " Git統合
Plug 'neoclide/coc.nvim', {'branch': 'release'}  " LSP/補完(代替: nvim-lspconfig + nvim-cmp)
Plug 'jiangmiao/auto-pairs'     " 括弧自動補完
Plug 'itchyny/lightline.vim'    " ステータスライン
call plug#end()
EOF
mkdir -vp ~/.config/mpv
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/tomasklaen/uosc/HEAD/installers/unix.sh)"
cat <<'EOF' > ~/.config/mpv/mpv.conf
geometry=800x600
border=no
snap-window=yes
volume-max=200
af=loudnorm=I=-24.0,acompressor,superequalizer=1b=0.5:3b=0.5:5b=0.4:7b=0.6:9b=0.9:11b=1.0:13b=0.7:15b=0.5:17b=0.4
hwdec=auto
ytdl-format=best[height<=720]
#ytdl-format=best[height<=480]
osc=no
osd-bar=no
osd-font=Noto Sans CJK JP
sub-font=Noto Sans CJK JP
EOF
mv -vt /home/"${NEW_USER}"/ /root/{.bashrc,.settings,.aliases,.functions}
chown -v "${NEW_USER}:${NEW_USER}" /home/"${NEW_USER}"/{.bashrc,.settings,.aliases,.functions}
rsync -a --progress ~/.config/ /home/"${NEW_USER}"/.config/
rm -vrf ~/.config
chown -vR "${NEW_USER}:${NEW_USER}" /home/"${NEW_USER}"/.config
echo "ユーザーの設定ファイルを配置しました。"

echo "Neovim のプラグインをインストールしています..."
su - "${NEW_USER}" -c 'bash -lc "
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
  https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
nvim +PlugInstall +qall
nvim -c \"helptags ALL\" -c qa
"'
echo "Neovim のプラグインをインストールしました。"

# === 最低限のチェック出力 ===
echo "===== 設定完了 ====="
echo "ユーザー: ${NEW_USER}"
echo "ロケール: ${LOCALE}"
echo "タイムゾーン: ${TIMEZONE}"
echo "AUR ヘルパー: ${AUR_HELPER}"
echo "必要なら WSL を再起動してください。"

上記のスクリプトでは以下のようなパッケージをインストールしています。

パッケージマネージャ(pacman/yay)

パッケージの管理にはpacmanを使用します。

ヘルプを表示

# pacman -h

オペレーション-Sのオプションを表示

# pacman -S -h

インストール済みのパッケージをアップデート

# pacman -Syu

パッケージfooをインストール

# pacman -S foo

インストール済みのパッケージを表示

# pacman -Qe

名前にfooを含むパッケージを検索(正規表現も使用可)

# pacman -Ss foo
# pacman -Sl | grep foo

パッケージfooの詳細を確認

# pacman -Si foo

パッケージグループのリストを表示

# pacman -Sg

パッケージグループfooに含まれているパッケージを表示

# pacman -Sgg foo

パッケージfooをアンインストール

# pacman -Rs foo

未使用のキャッシュを削除

# pacman -Sc

pacmanの代わりにyayを使用すればAUR(Arch User Repository)にもアクセスできます。AURには公式にはない多くのパッケージが収録されています。エイリアス(コマンドの別名)を~/.aliasesに設定しているので参照してください。yayの使い方はpacmanと同じですが、管理者権限は不要です。

$ cat ~/.aliases | grep yay

シェル(bash)

入力したコマンドはシェルが実行します。デフォルトのシェルはbashです。詳細についてはとほほのBash入門/bash入門/UNIXの部屋などを参照してください。

シェルの基本的なコマンドを以下に示します。

cat 連結したファイルの内容を表示
cd カレントディレクトリを変更
chmod ファイルのパーミッションを変更
chown ファイルの所有者・所有グループを変更
cp ファイルをコピー
echo 引数の文字列を表示
find ファイルを検索
grep パターンにマッチする行を検索
less テキストファイルを閲覧
ls ディレクトリの内容を表示
man コマンドのマニュアルを表示
mkdir 新しいディレクトリを作成
mv ファイルを移動・リネーム
pwd カレントディレクトリのパスを表示
rm ファイルを削除
tar アーカイブファイルを処理
xargs 標準入力をコマンドの引数に指定

実行中のコマンドを強制的に停止するにはCtrl+cを押します。

コマンドのオプションは-(ハイフン)で指定します。-(ハイフン)が単独で使用された場合は標準入出力として扱われます。--はコマンドオプションの終わりを指示します。スペース・タブ・改行はデリミタ(区切り文字)として機能します。コマンドラインやシェルスクリプトでこれらの空白文字を不用意に入力しないでください。エラーを引き起こす原因になります。

シェルには以下のメタキャラクタ(特殊文字)が存在しこれらの文字はシェルの中で特別な意味を持ちます。

*?~#\$"'`!;|<>&()[]{}

メタキャラクタを普通の文字として扱いたい場合は\(バックスラッシュ)でエスケープします。’(シングルクォート)で文字列を括れば文字列内のメタキャラクタをすべてエスケープできます。’(シングルクォート)ではなく"(ダブルクォート)を使用するとメタキャラクタがシェルに解釈されます。

ワイルドカードを使用すればパターンにマッチする複数のファイルを一括で処理できます。詳細については用語集:ファイルグロブ: UNIXの部屋を参照してください。

パイプラインやリダイレクトを使用すればコマンドをつなげて実行したりコマンドの入出力先を変更したりできます。詳細については用語集:リダイレクト: UNIXの部屋入力と出力 | UNIXコマンド・シェルスクリプトリファレンスを参照してください。

リダイレクトについてかみ砕いて説明します。知っておくべきことは次のとおり。

ディスクリプタn, ディスクリプタmおよびファイルfoo.txtに対して以下のように記述します。

n<foo.txt コマンドの入力nにファイルfoo.txtをセットする(n=0ならnを省略可)
n<&m コマンドの入力nにmをセットする(n=0ならnを省略可)
n>foo.txt コマンドの出力nにファイルfoo.txtをセットする(n=1ならnを省略可)
n>&m コマンドの出力nにmをセットする(n=1ならnを省略可)
&>foo.txt もしくは >&foo.txt 標準出力・標準エラー出力をまとめてファイルfoo.txtに出力する

テキストエディタ(msedit/neovim)

mseditはターミナルで使用できるテキストエディタです。 mseditでテキストファイルを開くにはコマンドmseditにテキストファイルのパスを指定します。

$ msedit ~/foo.txt

後述するvimの操作に慣れるまではmseditを使用するといいでしょう。

vimはターミナルで使用できるテキストエディタです。neovimはvimを再設計したものです。詳細についてはまくまくVimノート名無しのvim使いを参照してください。

neovimの設定は~/.config/nvim/init.vimに記述します。ここでは設定を管理しやすくするために~/.config/nvim/init.vimを分割して、~/.config/nvim/vimrc.d/00-settings.vimに基本設定、~/.config/nvim/vimrc.d/10-mappings.vimにキーマッピング、~/.config/nvim/vimrc.d/20-plugins.vimにプラグインを記述しています。(各設定ファイルを~/.config/nvim/init.vimでロードするようにしています)

neovimでテキストファイルを開くにはコマンドnvimにテキストファイルのパスを指定します。オプション-Rを指定すると読み出しモードで開くことができます。

$ nvim ~/foo.txt
$ nvim -R ~/foo.txt

vimには[ノーマル/インサート/ビジュアル/コマンド]の4つのモードがあります。編集コマンドを受け付けるノーマルモードで起動し、ノーマルモードを軸に他の3つのモードに遷移します。文字を入力するときはインサートモードに移行します。範囲を選択するときはビジュアルモードに移行します。検索や置換などのコマンドを実行するときはコマンドモードに移行します。ノーマルモードまたはビジュアルモードで:(コロン)を入力するとコマンドモードに移行し、下のコマンドラインから:に続けて任意のコマンドを入力できます。ノーマルモードに戻るにはEsc(Ctrl+[)もしくはCtrl+cを入力します。

vimの基本的なコマンドを以下に示します。詳細についてはVS Codeで始めるVimを参照してください。

[ノーマルモード]
カーソルを下に移動 j もしくは Ctrl+n
カーソルを上に移動 k もしくは Ctrl+p
カーソルを右に移動 l もしくは Space
カーソルを左に移動 h もしくは BackSpace
カーソルを次の単語に移動 w もしくは W (記号を無視)
カーソルを次の単語の末尾に移動 e もしくは E (記号を無視)
カーソルを前の単語に移動 b もしくは B (記号を無視)
カーソルを前の単語の末尾に移動 ge もしくは gE (記号を無視)
カーソルを右方向・左方向の最初のjに移動(前後に再検索) fj ↔ Fj (; ↔ ,)
カーソルを右方向・左方向の最初のjの手前に移動(前後に再検索) tj ↔ Tj (; ↔ ,)
カーソルを行末に移動 $
カーソルを行頭に移動 0 もしくは ^ (行頭の空白文字を無視)
カーソルを128行目に移動 128G
カーソルを最後の行に移動 G
カーソルを最初の行に移動 gg
画面を下にスクロール Ctrl+f もしくは Ctrl+d (半画面)
画面を上にスクロール Ctrl+b もしくは Ctrl+u (半画面)
カーソル位置の文字を削除 x
カーソル位置の手前の文字を削除 X
カーソル位置の単語をカット diw
カーソル位置の単語をコピー yiw
カーソル位置から右側を削除 D
カーソル位置の行をカット dd
カーソル位置の行をコピー yy
カーソル位置(行ならカーソル位置の下)にペースト p
カーソル位置の手前(行ならカーソル位置の上)にペースト P
レジスタ"3の内容をペースト "3p
行を連結 gJ もしくは J (間にスペースを1文字挿入)
アンドゥ u もしくは U (行全体)
リドゥ Ctrl+r
直前の操作の繰り返し .
カーソル位置の数字をインクリメント・デクリメント Ctrl+a ↔ Ctrl+x
対応する括弧を検索 %
カーソル位置の単語を後方(前方)検索 * ↔ #
カーソル位置の文字(文字列)を置換 r ↔ R
[ノーマルモード] → [インサートモード]
カーソル位置・カーソル位置の後ろから入力開始 i ↔ a
カーソル位置の行頭・行末から入力開始 I ↔ A
カーソル位置の下・上に挿入した空行から入力開始 o ↔ O
カーソル位置の文字・行を削除して入力開始 s ↔ S
カーソル位置の単語を削除して入力開始 ciw
カーソル位置の" "の中身を削除して入力開始 ci"
カーソル位置から右側を削除して入力開始 C
[ノーマルモード] → [ビジュアルモード]
カーソル位置から選択 v
カーソル位置から行選択 V
カーソル位置から矩形選択 Ctrl+v
直前の選択範囲を選択 gv
[ノーマルモード] → [コマンドモード]
ヘルプを表示 :h
変更を保存して終了 :x もしくは :wq もしくは ZZ
変更を保存せずに終了 :q! もしくは ZQ
レジスタの内容を表示 :di もしくは :reg
順方向・逆方向に文字列fooを検索(前後に再検索) /foo ↔ ?foo (n ↔ N)
検索文字列のハイライトを解除 :noh
ファイル全体の文字列fooを文字列barに置換 :%s/foo/bar/g
ファイル全体の文字列fooを文字列barに確認しながら置換 :%s/foo/bar/gc
ファイルfoo.txtをバッファに追加 :e foo.txt
バッファのファイルをリスト :ls
バッファのファイルfoo.txtに切り替え(バッファの番号も指定可) :b foo.txt
バッファのファイルをすべて終了 :qa
カーソル位置にファイルfoo.txtを挿入 :r foo.txt
[インサートモード]
カーソル位置の上・下の行の文字をコピーして入力 Ctrl+y ↔ Ctrl+e
カーソル位置の行をインデント・逆インデント Ctrl+t ↔ Ctrl+d
単語を順方向・逆方向に検索して補完 Ctrl+n ↔ Ctrl+p
レジスタ"3の内容をペースト Ctrl+r3
[ビジュアルモード]
選択範囲をカット d
選択範囲をコピー y
選択範囲の大文字・小文字を反転 ~
選択範囲を大文字・小文字に変換 U ↔ u
選択行をインデント・逆インデント » ↔ «
[ビジュアルモード] → [インサートモード]
選択範囲をカットして入力開始 c
[ビジュアルモード] → [コマンドモード]
選択範囲の文字列fooを文字列barに置換 :’<,’>s/foo/bar/g
選択範囲の文字列fooを文字列barに確認しながら置換 :’<,’>s/foo/bar/gc
選択範囲を昇順にソート :’<,’>sort
選択範囲を降順にソート :’<,’>sort!

読み込んだファイルはバッファに保存され、バッファを切り替えることによって複数のファイルを同時に編集できます。ショートカットを利用するとコマンドラインで文字列を素早く入力できます。

置換対象の文字列を省略すると最後に検索した文字列が置換対象になります。大文字・小文字を区別しない場合は検索パターンに\cを指定します。正規表現を使用する場合は検索パターンに\vを指定します。

1から10の連番を入力するにはノーマルモードから [i] > [0] > [Enter] > [Esc] > [9.] > [ggVG] > [g] > [Ctrl+a] のようにします。Ctrl+aの前にgを入力すると増分をインクリメントしながらインクリメントできます。

エイリアスおよびシェルスクリプト

bashの設定は~/.bashrcもしくは~/.bash_profileに記述します。~/.bashrcはbashを起動するたびにロードされますが~/.bash_profileはログイン時に一度だけロードされます。ここでは設定を管理しやすくするために~/.bashrcを分割して、~/.settingsに基本設定、~/.aliasesにエイリアス(後述)、~/.functionsに関数(後述)を記述しています。(各設定ファイルをロードするように初期設定スクリプトで~/.bashrcを書き換えています)

変更した設定を有効にするには以下のようにしてbashを再起動するか

$ exec $SHELL -l

sourceコマンドを入力して設定ファイルをリロードします。sourceコマンドは.(ドット)コマンドで代用可能です。

$ source ~/.bashrc

よく使用するコマンドのエイリアス(alias: 別名)を~/.aliasesに定義しているので参考にしてください。 エイリアスを一時的に無効にしたい場合はコマンドの先頭に\(バックスラッシュ)をつけます。たとえばエイリアスとして設定したlsコマンドを本来のlsコマンドとして実行したいときは次のように入力します。

$ \ls

シェルでは以下のように関数を定義してコマンドを自作することもできます。

~/.functions
# cdコマンドを実行するとlsコマンドを実行する
function cd()
{
  if builtin cd $1; then
    ls
    return 0
  else
    echo "$1に移動できません" 1>&2
    return 1
  fi
}

# ファイルfooのコピーfoo~を作成する
function bcp()
{
  if [ -f "$1" ] ; then
    cp $1 $1~
    return 0
  else
    echo "ファイル$1は存在しません" 1>&2
    return 1
  fi
}

一度にたくさんのコマンドを実行したい場合はシェルスクリプトを利用しましょう。スクリプトの書き方については、まくまくLinux/ShellノートUNIXコマンド・シェルスクリプトリファレンスで詳しく解説されているので、そちらを参考にしてください。

変数の特殊な参照方法についてかみ砕いて説明します。ポイントは次の3つです。

${var=foo} $varが使用済みなら$varの値を返す。$varが未使用なら$varにfooを代入してfooを返す。
${var-foo} $varが使用済みなら$varの値を返す。$varが未使用なら$varにfooを代入せずにfooを返す。
${var+foo} $varが使用済みなら$varにfooを代入せずにfooを返す。$varが未使用ならNULLを返す。
${var:=foo} $varが使用済みなら$varの値を返す。$varが未使用もしくはNULLなら$varにfooを代入してfooを返す。
${var:-foo} $varが使用済みなら$varの値を返す。$varが未使用もしくはNULLなら$varにfooを代入せずにfooを返す。
${var:+foo} $varが使用済みなら$varにfooを代入せずにfooを返す。$varが未使用もしくはNULLならNULLを返す。

バージョン管理システム(git)

gitはバージョン管理システムです。ローカルにリポジトリ(入れ物)を置くと、そこにファイルの更新履歴が記録されます。GitHubなどにあるリモートのリポジトリにもアクセスできます。

以下のコマンドを入力するとカレントディレクトリにディレクトリ.gitが生成されてカレントディレクトリがローカルリポジトリになります。

$ git init

ローカルリポジトリの実体はディレクトリ.gitです。この中にリポジトリのスナップショット(.gitが置かれているディレクトリの状態)が保存されます。リポジトリにあるファイルを更新してリポジトリを更新(コミット)するとスナップショットが作成されます。複数の時系列(ブランチ)を同時並行で管理したり、異なる時系列を合成(マージ)したりすることもできます。

gitのチュートリアルとしてはサル先生のGit入門がオススメです。gitコマンドの使い方およびgitの設定についてはとほほのGit入門まくまくGitノートを参照してください。

ダウンロードマネージャ(curl/wget)

リモートのファイルをダウンロードするにはcurlおよびwgetを使用します。

ファイルをダウンロードするにはファイルのURLを指定してコマンドcurlもしくはwgetを入力します。

$ curl http://www.example.com/path/to/file
$ wget http://www.example.com/path/to/file

ウェブサイトをダウンロードするには以下のオプションと共にURLを指定してコマンドwgetを入力します。エイリアスを設定しておくと便利です。

$ wget --mirror --convert-links --adjust-extension --page-requisites --no-parent http://www.example.com/

FTPクライアント(lftp)

lftpはターミナルで使用できるFTPクライアントです。FTPサーバとファイルをやりとりするために使用します。コマンドlftpを入力するとlftpのシェルが起動して、以下のようなプロンプトが表示されます。

$ lftp
lftp :~>

FTPサーバのアカウントにログインするには続けて次のように入力します。ユーザ名とホスト名を自身のものに置き換えてください。

lftp :~> open -u USERNAME HOSTNAME

続けてアカウントのパスワードを要求されます。正しいパスワードを入力するとログインに成功します。FTPサーバにログインしたらlftpのコマンドを使用してサーバにファイルをアップロードしたりサーバからファイルをダウンロードしたりできます。

lftpの基本的なコマンドには以下のようなものがあります。lftpを終了するにはコマンドbye/exit/quitなどを入力します。

cd サーバのディレクトリを変更
lcd クライアントのディレクトリを変更
put クライアントのファイルをアップロード
get サーバのファイルをダウンロード
mput クライアントの複数ファイルをアップロード
mget サーバの複数ファイルをダウンロード
rm サーバのファイルを削除
help コマンドリスト・コマンドのヘルプを表示

スクリプトを使用してクライアントからサーバにディレクトリの内容をミラーリングアップロードする方法を紹介します。あらかじめ以下のようなスクリプト~/upload.rcを作成しておきます。

$ nvim ~/upload.rc
~/upload.rc
# ユーザ名(USERNAME)・パスワード(PASSWORD)・ホスト名(HOSTNAME)を自分のものに置き換えてください。オプション--dry-runを指定して正しく処理されることを確認してください。--dry-runを外すと実行されます。

open -u USERNAME,PASSWORD HOSTNAME  # FTPサーバにログインします
mirror --reverse -R -n -e -p -v --dry-run /local/path/to/dir /remote/path/to/dir
# mirror --reverse -R -n -e -p -v /local/path/to/dir /remote/path/to/dir  # FTPサーバにミラーリングアップロードします
close # FTPサーバからログアウトします

スクリプト~/upload.rcを指定してコマンドlftpを入力します。

$ lftp -vf ~/upload.rc

メールクライアント(neomutt)

muttはターミナルで使用できるメールクライアントです。neomuttはmuttの機能を拡張したものになっています。詳細についてはMutt - ArchWikiThe Mutt E-Mail Clientを参照してください。

muttの設定を~/.muttrcに記述します。

~/.muttrc
# 受信(IMAP)の設定
set imap_user = USERNAME  # ユーザ名
set imap_pass = PASSWORD  # パスワード
set folder = imap[s]://imap.server.domain[:port]/[folder/]  # IMAPサーバのアドレス
# 以下の"+"はfolderの内容に置換される
set spoolfile = +INBOX  # 受信したメールを保存するメールボックス
set postponed = +Drafts # 下書きのメールを保存するメールボックス
set record = +Sent      # 送信済みのメールを保存するメールボックス
set header_cache = ~/.mutt/cache/headers/     # メッセージのヘッダを保存するディレクトリ
set message_cachedir = ~/.mutt/cache/bodies/  # メッセージを保存するディレクトリ
set certificate_file = ~/.mutt/certificates   # 証明書を保存するファイル
set imap_check_subscribed # 新着メールを定期的にチェック
# mailboxes +INBOX          # 新着メールをチェックするメールボックス
unset imap_passive        # 新着メールをチェックする接続の許可
set imap_keepalive = 300  # 接続を維持するためのポーリングの間隔(秒)
set mail_check = 120      # 新着メールをチェックする間隔(秒)

# 送信の設定
set smtp_url = smtp[s]://username@smtp.server.domain[:port] # SMTPサーバのアドレス
set smtp_pass = PASSWORD        # パスワード;
set from = YOUR_E-MAIL_ADDRESS  # メールアドレス
set realname = YOUR_REAL_NAME   # 名前

set editor = nvim # メッセージの編集に使用するエディタ

コマンドneomuttを入力するとneomuttが起動します。

$ neomutt

メールサーバに接続すると受信したメールがリストされます。選択してSpaceを押すとメッセージが表示されます。メールボックスを変更するにはcを押します。続けてTabを押すとメールボックスがリストされます。選択してEnterを押すとメールボックスが変更されます。メールを作成するにはmを押します。宛先(To)と件名(Subject)を入力するとエディタが起動するのでメッセージを入力します。保存してyを押すとメールが送信されます。

ウェブブラウザ(w3m)

w3mはターミナルで使用できるウェブブラウザです。テキストのみ表示できます。詳細についてはw3m マニュアルを参照してください。

URLを指定してコマンドw3mを入力するとw3mが起動してサイトが表示されます。

$ w3m google.co.jp

基本的なキー操作はlessやvimに似ています。マウス操作にも対応しています。Hを押すとヘルプが表示されます。設定を変更したいならoを押します。qを押せば終了します。キーバインドを変更したい場合は~/.w3m/keymapを書き換えます。ウェブを検索する関数w3m-searchを~/.functionsに定義しているので使ってみてください。

スクリプト言語(node.js/python/perl)

node.js/python/perlの実行環境がインストールされていることを確認します。

$ node --version
$ python --version
$ perl --version

スクリプトが正しく実行されることを確認します。

$ cd
$ mkdir hello
$ cd hello
$ echo 'console.log("Hello World!");' >hello.js
$ echo 'print ("Hello World!")' >hello.py
$ echo 'print "Hello World!\n";' >hello.pl
$ node hello.js
$ python hello.py
$ perl hello.pl