Linuxコマンドの代替・上位互換コマンドを使ってみよう – z, eza, fd, rg, bat, tldr

Linuxコマンドの代替コマンド、上位互換コマンドを紹介する動画を見ていて、知らないコマンドばかりだったので、実際に使ってみました。

コマンド自体はすべてmacOSでインストールして試しています。公式サイトのURLを付けていますので、その他のプラットフォームの場合は公式サイトご確認ください。

z – cdの代替コマンド

zcdの代替コマンドです。cdコマンドと比べて移動に関する操作が強化されています。

インストール方法

macOSへインストールするにはHomebrewを使用します。

brew install zoxide

インストール後、~/.zshrcに以下を追記し、シェルを再起動します。

eval "$(zoxide init zsh)"

使用方法

コマンドが違うだけで基本的にはcdコマンドと同じように使用できます。ただ、前にいたディレクトリへの復帰の方法がとても強力です。

$ z foo
$ mkdir -p bar/baz
$ mkdir -p abc/def
# foo/bar/bazディレクトリに移動する
$ z bar/baz
# 直前にいたfooディレクトリに戻る
$ z -
# 移動したことのあるbazディレクトリに直接移動する
$ z baz
$ z -
$ z abc/def
# 移動したことがあるなら直前にいたディレクトリでなくても移動可能
$ z baz
$ z def

2つ以上のディレクトリを行き来するときとかは重宝しそうです。

eza – lsの代替コマンド

ezaはexaからフォークしたコマンドで、現在はこちらがメンテナンスされているようです。

ezalsの代替コマンドです。lsコマンドよりも高い可読性の表示が簡単にできるのが特徴です。

インストール方法

macOSへインストールするにはHomebrewを使用します。

brew install eza

使用方法

eza

eza -l

色つきや下線がついた見やすい表示になります。

fd – findの代替コマンド

fdfindの代替コマンドです。特定の文字列を含むファイル名やディレクトリ名を簡単に探すことができます。

インストール方法

macOSへインストールするにはHomebrewを使用します。

brew install fd

使用方法

複雑なオプションを使わずにファイルやディレクトリを検索できます。

# fooを含むファイル名、ディレクトリ名を現在のディレクトリから再帰的に検索する
$ fd foo
# ファイルのみを検索したいとき
$ fd --type f foo
# ディレクトリのみ検索したい場合
$ fd --type d foo
# fooを含むファイル名、ディレクトリ名をディレクトリbarを基点に再帰的に検索する
$ fd foo bar

findコマンドはオプションを色々覚えないといけないですし、環境やバージョンによってオプションが異なることがあるため、毎回調べる手間を大幅に削減できるのがうれしいですね。

rg – grepの代替コマンド

rggrepの代替コマンドです。ファイルの中に文字列をGrepすることに特化したコマンドで、サクラエディタのGrep機能をコマンド化したような使い心地です。

インストール方法

macOSへインストールするにはHomebrewを使用します。

brew install ripgrep

使用方法

オプションおよびコマンドの組み合わせなしでファイルの中身のGrepができます。

# 現在ディレクトリを基点に再帰的に'foo'が含まれる行を検索する
$ rg foo
# オプションなしで正規表現が使用可能
$ rg 'ba[rz]'
# 検索する基点となるディレクトリを指定可能(barディレクトリを基点に検索)
$ rg foo bar
# 拡張子を絞って検索することも可能
$ rg foo -g '*.css'

bat – catの代替コマンド

batcatの代替コマンドです。catコマンドよりも高機能かつ見やすい表示にしてくれます。

インストール方法

macOSへインストールするにはHomebrewを使用します。

brew install bat

使用方法

catと同じでファイル名を指定してファイルの中身を表示できるのは同じですが、moreコマンドなどと組み合わせる必要がなく、色も付けてくれるのでかなり見やすくなります。

tldr – manの補完コマンド

こちらは代替コマンドというよりは補完するコマンドだと言えます。tldrコマンドで調べて、それでも不足している場合はmanコマンドで調べるという使い方がよさそうです。

インストール方法

macOSへインストールするにはHomebrewを使用します。かつてはtldrという名前でインストールできていたようですが、現在はtlrcという名前でインストールします。

brew install tlrc

使用方法

manコマンドと同じようにコマンド名を引数にします。

すっきりとした見た目なので非常にわかりやすいですね。さっと調べたい場合はtldrコマンドで調べて、もっと詳しくいろいろなオプションを調べたい場合はmanコマンドを使うようにするとよいと思います。

コマンドの使い方を調べるコマンドは他にもあるので簡単に紹介します。

cheat

tldrと似ていますが、チートシートをローカルにダウンロードして、それを編集して自分で育てることができます。

$ brew install cheat
# コマンドを始めて調べるときはコミュニティ提供のチートシートをダウンロードできる
$ cheat sort
A config file was not found. Would you like to create one now? [Y/n]: y
Would you like to download the community cheatsheets? [Y/n]: y
Cloning community cheatsheets to /Users/t0k0sh1/.config/cheat/cheatsheets/community.
Enumerating objects: 335, done.
Counting objects: 100% (335/335), done.
Compressing objects: 100% (310/310), done.
Total 335 (delta 43), reused 213 (delta 23), pack-reused 0
Cloning personal cheatsheets to /Users/t0k0sh1/.config/cheat/cheatsheets/personal.
Created config file: /Users/t0k0sh1/.config/cheat/conf.yml
Please read this file for advanced configuration information.
# 以降はチートシートを表示する
# To sort a file:
sort <file>

# To sort a file by keeping only unique:
sort -u <file>

# To sort a file and reverse the result:
sort -r <file>

# To sort a file randomly:
sort -R <file>

# To sort a file and store the output in another file:
sort <inputFile> -o <outputFile>

# Sort by default uses /var/tmp to store temp files but size of /var/tmp directory is limited. In order to sort huge use a directory with adequate size:
sort -T <tempDirectory> <file>
# 一度ローカルに保存したチートシートは編集できる
$ cheat -e sort

howdoi

プログラマ向けのQ&Aサイトから回答を調べて表示するコマンドです。

$ brew install howdoi
# JavaのStream APIでsortをするときの書き方を調べるにはキーワードを並べる
$ howdoi java stream sort
List result = list.stream().sorted((o1, o2)->o1.getItem().getValue().
                                   compareTo(o2.getItem().getValue())).
                                   collect(Collectors.toList());

まとめ

個人的にはfd、rgコマンドはこれからも使っていきたいと思いました。もちろん、シェルスクリプトではfindコマンドやgrepコマンドはこれからも使うと思います。

伝統的なコマンドを使いこなすことも重要ですが、使いにくいと思うコマンドを別のコマンドに置き換えてより効率的に作業をこなすのも重要なことだと思いますので、積極的に試していきたいと思います。

SSH接続時に「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」のエラーが出るときの対処法

今までSSH接続していたサーバを再インストールしたり、IPやホスト名は同じですが別のサーバが導入した場合にSSH接続しようとすると、「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」というエラー(警告)が出て接続できない場合があります。

$ ssh 192.168.0.16
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:FNjxRHnzRjm709c/sch7pZ9SuPjj0S6lp8ZrY+0scks.
Please contact your system administrator.
Add correct host key in /Users/t0k0sh1/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/t0k0sh1/.ssh/known_hosts:6
Host key for 192.168.0.16 has changed and you have requested strict checking.
Host key verification failed.

過去に接続していたサーバーを再インストールしたため、リモートホスト鍵が変わっており中間者攻撃(Man In The Middle Attack)を疑われています。

known_hostsからホスト鍵を削除する

もちろん、悪意のあるサーバーに接続していないことが確認されていることが前提となりますが、known_hostsから以前登録していたホスト鍵を削除することでこの問題を解消できます。

$ ssh-keygen -R 192.168.0.16
# Host 192.168.0.16 found: line 4
# Host 192.168.0.16 found: line 5
# Host 192.168.0.16 found: line 6
/Users/t0k0sh1/.ssh/known_hosts updated.
Original contents retained as /Users/t0k0sh1/.ssh/known_hosts.old

ssh-keygen -Rコマンドで接続先のサーバーを指定するとknown_hostsからホスト鍵を削除できます。

再度接続を試みと、初回接続時と同じように接続するかの確認が行われます。

$ ssh 192.168.0.16
The authenticity of host '192.168.0.16 (192.168.0.16)' can't be established.
ED25519 key fingerprint is SHA256:FNjxRHnzRjm709c/sch7pZ9SuPjj0S6lp8ZrY+0scks.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.16' (ED25519) to the list of known hosts.
t0k0sh1@192.168.0.16's password:
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.15.0-27-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Tue Apr 26 11:20:18 PM UTC 2022

  System load:  0.080078125       Temperature:             39.0 C
  Usage of /:   6.7% of 97.87GB   Processes:               143
  Memory usage: 1%                Users logged in:         1
  Swap usage:   0%                IPv4 address for wlp1s0: 192.168.0.16


1 update can be applied immediately.
To see these additional updates run: apt list --upgradable


Last login: Tue Apr 26 23:03:25 2022
t0k0sh1@192.168.0.16:~$

依然と同じホスト鍵を使用している場合はこの問題は起きませんが、そうでない場合は、

  • サーバーを再インストールした
  • 別のサーバーだが同じIPアドレスやホスト名のサーバを立てた
  • ホスト鍵を変更した

といったときに発生します。

UbuntuでノートPCを閉じてもサスペンドさせない方法

ノートPCの蓋を閉じたときにサスペンドさせないようにする設定について解説します。

本手順はUbuntu Server 20.04で確認しています

実施する作業は以下の2点です。

  • ノートPCの蓋を閉じてもサスペンドしないようにする
  • 一定期間操作していないときにサスペンドしないようにする

ノートPCの蓋を閉じてもサスペンドしないようにする

最初に行う設定は、ノートPCを閉じたときにサスペンドしないようにする設定です。

/etc/systemd/logind.confを編集します。

$ sudo vi /etc/systemd/logind.conf

/etc/systemd/logind.confの以下の行を探し、

#HandleLidSwitch=suspend

以下のように書き換えてください。

HandleLidSwitch=ignore

もし、該当行がない場合は追記してください。

書き替えたあとはsystemdを再起動します。

$ sudo systemctl restart systemd-logind.service

一定期間操作していないときにサスペンドしないようにする

前述の設定だけでは不十分で、しばらくキーボードやマウスの操作をしていないときはサスペンドしてしまいます。

環境依存だと思いますが、インストールしたばかりのUbuntu Serverには/usr/share/gdmが存在しませんでしたので、先にディレクトリを作成します。

$ sudo mkdir -p /usr/share/gdm/dconf

ディレクトリ作成後にファイルを作成します。

$ sudo vi /usr/share/gdm/dconf/90-local-settings

ファイルの内容は以下のようにしてください。

[org / gnome / settings-daemon / plugins / power]
sleep-inactive-ac-timeout = 0
sleep-inactive-battery-timeout = 0

ファイルがある場合は上記のように編集してください。

ファイルを保存後、Ubuntuを再起動してください。

$ sudo reboot
モバイルバージョンを終了