ウェブサイト検索

Bash、Fish、Zshで前のコマンドの最後の引数を挿入する


ターミナルで同じファイル名やフォルダのパスを何度も入力していますか?もっと簡単な方法があります!このガイドでは、Bash、Fish、Zshで前回のコマンドの最後の引数を挿入するさまざまな方法を学ぶことができます。再入力不要、エラーなし!

前のコマンドの最後の引数を再利用する方法を学ぶことで、時間を節約し、入力ミスを防ぐことができます。

これらのトリックはすべて Bash で動作するはずです。いくつかは Fish、Zsh、およびその他のシェルでも動作する場合があります。さあ、始めましょう!

最後の引数とは何ですか?

最後の引数は、コマンドの最後の語またはパラメーターです。例えば:

mkdir /home/user/my-long-project-name

ここで、/home/user/my-long-project-name は最後の引数です。この長いパスをもう一度入力する代わりに、自動的に再利用できます。

方法1: 前のコマンドの最後の引数を $_ 変数を使って挿入する

$_ 変数は、前のコマンドの最後の引数を取得する最も簡単な方法です。

例 1:

mkdir project-folder
cd $_

これにより「project-folder」というフォルダが作成され、そのフォルダに移動します。$_ は自動的に「project-folder」になります。

例 2:

cp /var/log/nginx/access.log /tmp/backup/
ls -la $_

これはログファイルをバックアップフォルダにコピーし、そのバックアップフォルダの内容を一覧表示します。長いパスを二度入力する必要はありません!

例 3:

touch notes.txt && nano $_
  • touch notes.txt はファイルを作成します。
  • `nano $_` は Nano エディタで `notes.txt` を開きます。

これは、2つのコマンドを連鎖させるときによく機能します。

$_ を使う時

  • スクリプトや自動化に最適です。$_ は、最後のコマンドが実行された後にのみ展開されるため、スクリプトで使用しても安全です。
  • すべての主要なシェルで動作します。
  • ファイル操作のための最も信頼できる方法。

方法2: 前のコマンドの最後の引数を !$ を使って再利用する

!$ は、前のコマンドの最後の引数を取得するヒストリー展開です。!$ のショートカットは、$_ が その後に機能するのとは異なり、次のコマンドが実行される 前に 機能することに注意してください。

例 1:

touch important-document.txt
vim !$

これはファイルを作成し、その後編集のために開きます。!$ は「important-document.txt」になります。

例 2:

wget https://example.com/large-file.zip -O file.zip
unzip !$
rm !$

これはファイルをダウンロードし、解凍してから、元のzipファイルを削除します。

!$の使い時

  • <strong>対話型端末での使用に最適です</strong>。
  • 素早く簡単に入力できる。
  • 簡単なコマンドではうまく動作します。!$ はスクリプトや複雑なコマンドでは常にうまく動作するわけではありません。

安全のヒント: 以下のコマンドを使用して履歴確認を有効にし、!$ が何に展開されるかを確認してください:

shopt -s histverify

方法3: Alt+. キーボードショートカットを使用して最後のコマンド引数を挿入する

Alt+. キーボードショートカットは、カーソルのある位置に最後のコマンドの引数を挿入します。

使い方:

  1. コマンドを入力してください: mkdir my-project
  2. 実行するにはEnterキーを押してください
  3. 入力を開始: cd
  4. Alt + .(または Esc + .)を押します
  5. それは自動的に「my-project」を挿入します

サイクリング機能

以前の引数を順に切り替えるには、Alt + . を複数回押します:

git add file1.txt
git commit -m "Added new feature"
git push origin main
cd Alt+.        # Shows "main"
cd Alt+. Alt+.  # Shows "Added new feature"

Alt+. の使い時

  • インタラクティブなタイピングに最適です。
  • コマンドを実行する前にテキストを見ることができます。
  • 議論を編集する必要があるときに完璧です。

方法4:カスタム関数を作成する

ディレクトリの作成や移動などの一般的な作業には、自分の関数を作りましょう:

mkcd() { mkdir -p "$1" && cd "$1"; }

これをあなたの.bashrcファイルに追加して、次のように使用します:

mkcd new-project

これはディレクトリを作成し、1つのコマンドでそこに移動します。

より便利な機能

# Create and edit a file
touchedit() { touch "$1" && vim "$1"; }

# Copy and then list the destination
cpls() { cp "$1" "$2" && ls -la "$2"; }

関連記事:

  • Linuxでdeclareコマンドを使用してBash関数を管理する方法
  • LinuxでのFishシェルの関数管理方法

方法5:変数を使用する

非常に長いパスや複雑な引数の場合は、それらを変数に保存してください:

logfile="/var/log/application/debug-$(date +%Y%m%d).log"
tail -f "$logfile"
vim "$logfile"

この方法は、同じ長いパスを複数回使用する必要があるときに非常に有効です。

関連記事:

  • Bashスクリプト: 変数の説明と例

パワーユーザーのためのプロのコツ:複数の方法を組み合わせる

mkdir long-project-name
cd $_  # Runs cd long-project-name
touch readme.md
vim Alt+.  # Shows "vim readme.md"

比較表:どの方法を選ぶべきか?

方法最適スクリプトで作動実行前に編集可能
$_スクリプト、オートメーション✅ はい❌ いいえ
!$クイックインタラクティブ使用✅ はい❌ いいえ
Alt+.インタラクティブタイピング❌ いいえ✅ はい
関数繰り返される作業✅ はい❌ いいえ
変数複雑な議論✅ はい✅ はい

Bashにおける$_と!$の違い

Bashにおける$_と!$の違いは微妙ですが重要です。どちらも前のコマンドの最後の引数を指しますが、シェルが履歴や実行を処理する方法によって挙動が異なります。

$_:最後に実行されたコマンドの最後の引数

  • $_ は最後のコマンドが 実行された 後 に設定されます。
  • これはシェルによって実際に使用された最後の引数を保持します。
  • それはシェル変数として利用可能です。

`!$`: 最後に入力したコマンドの最後の引数

  • !$ は 履歴展開 の一部です。
  • それは次の意味です:「〈私が入力した前のコマンド〉の最後の引数を取る。」
  • これはコマンドが実行される前に展開されます。

例

実際の例を使って順を追って説明しましょう。

$ echo one two three
one two three

さて、$_を試してみてください:

$ echo $_
three

$_ は、最後のコマンドで使われた最後の単語である three を示します。

では、同じechoコマンドをもう一度実行してください:

$ echo one two three
one two three

それから !$ を試してください:

$ echo !$

!$ は前のコマンドで入力した最後の単語を指すため、three になります。

しかし、ここでは彼らが異なる例があります:

$ { echo A; echo B; }
A
B

さあ、やってみてください:

$ echo $_
B

$_ は B を表示します。なぜなら、それが前のコマンドブロックで 実際に実行された 最後の単語だったからです。

もう一度同じコマンドを試してみましょう:

$ { echo A; echo B; }
A
B

しかし走ること:

$ echo !$

予期しない出力を返す:

echo }
}

見てください?!$ は前のコマンドから最後の単語(つまり })を取得して、それを単純に表示します。

なぜなら:

  • `!$` は入力した内容に基づいて展開しようとします: `{ echo A; echo B; }`.
  • シェルは、解析の特性上、最後の単語(})を正しく扱わない場合があります。

Linuxで前のコマンドの最後の引数を挿入する

まとめ: $_ と !$

特徴$_!$
タイプシェル変数歴史の拡張
タイミングコマンド実行後コマンド実行前
ユースケーススクリプト、安全な再利用クイックタイピングショートカット
信頼できる?はい、スクリプトでいいえ、複雑な命令では壊せません
例mkdir dir && cd $_mkdir dir、次に cd !$

いつ何を使うべきか?

  • スクリプトや信頼できるワンライナーで$_を使ってください。
  • ファイル名や引数を素早く呼び出すときは、プロンプトで !$ を使用してください。
  • 複雑なコマンド構造(if、{}、パイプなど)では !$ を避けてください。

避けるべき一般的な間違い

1. 引用を忘れること

スペースを含む変数には常に引用符を付けてください:

# Wrong - will cause errors
file="my document.txt"
cat $file

# Right - handles spaces correctly
cat "$file"

2. スクリプトで !$ を使用する

スクリプトでは、!$ メソッドは確実に動作しません。代わりに $_ を使用してください:

#!/bin/bash
# This might not work as expected
mkdir project && cd !$

# This works reliably
mkdir project && cd $_

3. 受け取るものを確認しないこと

Alt+. を使うと、実行する前にテキストを見ることができます。これにより、ミスを防げます:

rm important-file.txt
# Later, you want to restore it
git checkout Alt+.  # You see "git checkout important-file.txt" before running

実際の例

1. ウェブ開発

# Download a project
git clone https://github.com/user/awesome-project.git
cd $_

# Start the development server
npm install
npm start

2. システム管理

# Check a log file
tail -f /var/log/apache2/error.log
# Edit the same file
sudo vim $_

3. ファイル管理

# Find a file
find /home -name "*.pdf" -type f
# Copy the found file
cp $(find /home -name "*.pdf" -type f | head -1) /tmp/
ls -la $_

一般的な問題のトラブルシューティング

コマンドが見つかりません

もし !$ が動作しない場合、ヒストリー展開が無効になっている可能性があります:

set +H  # Disable history expansion
set -H  # Enable history expansion

Alt+. が動作しない

これらの代替案を試してみてください:

  • Esc + .(特にMacで)
  • ターミナルのキー割り当てを確認してください
  • Bash または Zsh を使用していることを確認してください

$_ が間違った値を表示します

$_ 変数は各コマンドによって更新されます。使用したいコマンドの直後にそれを使っていることを確認してください:

mkdir test
echo "hello"  # This updates $_
cd $_  # This will try to cd to "hello", not "test"

チートシート

こちらは前のセクションで議論したすべての方法のチートシートです。印刷してデスクの近くに置き、すぐに参照できるようにしてください。

# Method 1: $_ variable
mkdir folder
cd $_

# Method 2: !$ history expansion  
touch file.txt
vim !$

# Method 3: Alt+. keyboard shortcut
mkdir project
cd [Alt+.]

# Method 4: Custom function
mkcd() { mkdir -p "$1" && cd "$1"; }

# Method 5: Variables
path="/long/path/to/file"
cp "$path" /backup/ && ls "$path"

よくある質問

Q: Alt + . はすべてのシェルで機能しますか?

A: Bash、Fish、Zshでは動作しますが、一部のターミナルアプリではAltキーを使ったショートカットを使用するために特別な設定が必要な場合があります。

Q: これらをスクリプトで使用できますか?

A: スクリプト内では $_ を使用してください。履歴から展開され予測できない動作をする可能性があるため、!$ は避けてください。

Q: Fishシェルはどうですか?

A: Fishは$_や!$をサポートしていませんが、インタラクティブな提案があり、Alt + ↑を使って引数を呼び出すことができます。

結論

前のコマンドから最後の引数を再利用することを学ぶことは、ターミナルの生産性に非常に役立ちます。覚えておくべきことは次のとおりです:

  • スクリプトや信頼できる自動化には $_ を使用する
  • クイックインタラクティブコマンドには !$ を使用します
  • 実行前に確認して編集したい場合は、Alt+. を使用してください
  • よく行う作業のための関数を作成する
  • 複雑なまたは繰り返される引数には変数を使用する

自分に最も合う方法から始めましょう。慣れてきたら、他の方法も試してみてください。すぐに、これらの時間節約のコツなしでどうやって仕事をしていたのか不思議に思うでしょう。

一番良い部分は?これらの方法は一緒に機能します。組み合わせることで、ターミナルの作業をより速くする強力なワークフローを作成できます。

今すぐターミナルでこれらの方法のいずれかを試してください。テスト用のディレクトリを作成し、$_ や Alt+. を使ってそのディレクトリに移動する練習をしましょう。一度これらのトリックを使い始めると、同じ引数を二度と入力したくなくなるでしょう!

おすすめの読書:

  • 初心者のためのBashスクリプトチュートリアル【26のトピック】
  • [Bashのコツ] 1つのコマンドでcdとlsを行う方法
  • Fishシェルで一つのコマンドでディレクトリを変更してファイルを一覧表示する方法