20200225のLinuxに関する記事は4件です。

【fish 版】ターミナル起動時に tmux の既存セッションをアタッチ

この記事なに?

@ssh0 さんの [tmux] 端末起動時に自動で新規セッションを作成 or 既存セッションにアタッチ - Qiita
という記事で解説されていた zsh の設定を、 fish 版に書き直してみたので紹介します。
軽くググってみても fish + tmux という環境で、ターミナル起動時に tmux の既存セッションをアタッチする記事がなかったので、備忘録を兼ねて書いておくことにしました。

実現したいこと

元記事で実現されていたのと同じ機能を fish で再現します。

  1. ターミナル起動時に tmux のセッションが無ければ新しくセッションを作る
  2. ターミナル起動時に tmux のセッションが残っていれば、セッションを選んでアタッチする
  3. セッション選択時、esc キーを押すと tmux は起動しない
  4. tmux のセッションをアタッチするのは fish がログインシェルで起動されたときのみ

前提

  • fish + tmux のターミナル環境を使っている
  • ~/.config/fish/config.fish がなにかの説明はしないので、わからない方は別途調べてください?
  • バージョン
    • fish >= 3.1
    • tmux >= 3.0

config.fish

早速ですが、完成品の config.fish です。

function attach_tmux_session_if_needed
    set ID (tmux list-sessions)
    if test -z "$ID"
        tmux new-session
        return
    end

    set new_session "Create New Session" 
    set ID (echo $ID\n$new_session | peco --on-cancel=error | cut -d: -f1)
    if test "$ID" = "$new_session"
        tmux new-session
    else if test -n "$ID"
        tmux attach-session -t "$ID"
    end
end

if test -z $TMUX && status --is-login
    attach_tmux_session_if_needed
end

1. ターミナル起動時に tmux のセッションが無ければ新しくセッションを作る

セッションが残っているかどうかは tmux list-sessions を実行すればわかります。
tmux list-sessions の結果を代入した ID が0文字であれば、セッションは無いので、新しいセッションを作ります。

fish は = で変数に代入できないので、代わりに set コマンドを使います。
コマンドの実行結果を変数に入れるには、コマンドを () で囲みます。

    set ID (tmux list-sessions)
    if test -z "$ID"
        tmux new-session
        return
    end

2. ターミナル起動時に tmux のセッションが残っていれば、セッションを選んでアタッチする

if test -z "$sessions" の条件を満たさなかったということは、セッションが残っているということなので、セッションをアタッチします。
まず、peco でアタッチするセッション一覧をユーザに選ばせます。
fzf を使っている方は適宜読み替えてください。
tmux list-sessions の結果からセッションIDだけを切り出して、tmux attach-session を実行しています。

    set ID (tmux list-sessions)
    # peco でセッションを選んでもらう
    set ID (echo $ID | peco | cut -d: -f1)

    #略...
    else if test -n "$ID"
        tmux attach-session -t "$ID"
    end

あと、セッションが残っていても、新しくセッションを作れるように、Create New Session という文字列をセッション一覧の最後に入れてます。

    set new_session "Create New Session" 
    set ID (echo $ID\n$new_session | peco | cut -d: -f1)
    if test "$ID" = "$new_session"
        # "Create New Session" を選ぶと新しくセッションを作る
        tmux new-session
    else if test -n "$ID"
        tmux attach-session -t "$ID"
    end

3. セッション選択時、esc キーを押すと tmux は起動しない

これは peco を使ったときの実装ですが、peco をキャンセルしたときの挙動をエラーにしておくと実現できます。
peco --on-cancel=error と書くと、pecoecs キーでキャンセルしたとき、 ID の文字列が 0文字になります。
なので、esc キーを押したときは else if test -n "$ID" を満たさなくなり、 tmux はセッションをアタッチしなくなります。

    set new_session "Create New Session" 
    set ID (echo $ID\n$new_session | peco --on-cancel=error | cut -d: -f1)
    if test "$ID" = "$new_session"
        tmux new-session
    else if test -n "$ID"
        tmux attach-session -t "$ID"
    end

4. tmux のセッションをアタッチするのは fish がログインシェルで起動されたときのみ

fish は status というコマンドで fish の実行状態を確認できます。
status はいろいろな状態を判定できますが、今回はログインシェルとして起動しているか知りたいので、status --is-login を使います。
よって、ターミナル起動時かつログインシェルとして fish が起動された、という条件は以下のように書きます。

if test -z $TMUX && status --is-login
    attach_tmux_session_if_needed
end

まとめ

こんな感じで動きます。

新規セッションを作成

tmux-newsession.gif

既存のセッションをアタッチ

tmux-attach.gif

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-machineのデフォルトOS,shellを確認してみました

結果

ディストリビューション:Core linux
シェル:bash
ディストリビューションはコアリナックスというミニマムなものでした。
core linux

シェルは有名なbashでした。

状況

docker-machineで立ち上げた時linuxっぽいものが
動いているけどディストリビューションは何だろう?
という疑問が出てきたので確認してみました。

以下docker、docker-machineが動く前提です。

確認した手順|コマンド

Verification.sh
#verificationという名前の仮想マシンを作る
$ docker-machine create verification

#verificationにsshで入る
$ docker-machine ssh verification

#ここからはverification内でのコマンド実行
#ディストリビューションを確認するコマンド実行
$ cat /etc/issue
Core Linux

#シェルを確認
$ echo $SHELL
/bin/bash

備考

ディストリビューション(正確にはlinuxの系列)や
シェルの違いでコマンドが違ってくるので自分用備忘録として書きました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Fish shellアップデート時のエラー対応

UbuntuのパッケージをアップデートしたらFish shellがエラーを吐くようになった

最近(2020/02/25)、Ubuntuのアップデートリクエストに従ってアップデートを行ったところ、Fish shellの起動時に次のようなエラーが発生するようになった。aptの履歴によるとfish shellが更新されている。

発生しているエラー

~/.config/fish/functions/fish_prompt.fish (line 162): Expected a string, but instead found a '&'
      git rev-parse --quiet --verify HEAD > /dev/null ^&1; or set empty 1
                                                       ^
from sourcing file ~/.config/fish/functions/fish_prompt.fish
in command substitution
source: Error while reading file '/home/dev-user/.config/fish/functions/fish_prompt.fish'
Welcome to fish, the friendly interactive shell

また、エラーだけでなく、プロンプトも次のようにいつもと違う表示になっている。

dev-user@thinkpad /home/dev-user >

自分の環境の場合、$HOMEにいるときは「 > 」のようにシンプルに表示されるのが正しい。

環境

Ubuntu 18.04.4 LTS
fish-common:amd64 (3.0.2-1~bionic, 3.1.0-1~bionic)
fish:amd64 (3.0.2-1~bionic, 3.1.0-1~bionic)

ThinkPad X1C 2017にUbuntuをデスクトップOSとしてネイティブインストールしています。
ターミナルソフトはterminator 1.91を使っています。

応急処置

原因と思われる
~/.config/fish/functions/fish_prompt.fish
の162行目は次のようになっている。

      git rev-parse --quiet --verify HEAD > /dev/null ^&1; or set empty 1

「^&1」の部分が問題の様子。
fishで「^」はエラー出力を表しているようなので(参照)、ディスクリプタの合成をやろうとしてミスしているのだろうと想像して次のように変更。

      git rev-parse --quiet --verify HEAD > /dev/null 2>&1; or set empty 1

とりあいず、エラーは消えている。

解釈

今回はエラー出力を標準出力に合成し、その結果をnullに渡すことによってすべての出力を非表示にして対応した。試しに標準出力を消さないパターンに変更したところ、フォルダを移動するたびにgit rev-parse ~~のコマンドが実行され、HEADと差分があるgit管理下のディレクトリではリビジョンなのかハッシュ文字列のようなものが表示されるようになった。プロンプトにそんな表示が現れるのはおかしな状況のため、エラー出力も含めて非表示にするのが実装者の意図だったのだと想像して上記対応を行ったけれど、あくまでご利用は自己責任で。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ls よりも exa を使おう!モダンな Linux コマンド達を紹介

はじめに

最近 GitHub で Rust 製の Linux コマンドを実装しているリポジトリをよく見かけるようになりました。使ってみるとカラフルでとてもオシャレな表示を行うコマンドが多くて便利でしたので、見つけたコマンドを一気に紹介していきたいと思います。

exa

まずは ls コマンドの代替である exa の紹介です。

https://github.com/ogham/exa

上記の画像を見ると分かる通り、カラフルで見やすいですね。右図のようにディレクトリのツリー表示にも対応しています。さらに --icons オプションを付けると、ファイルタイプに応じたアイコン表示も可能です。

bat

続いて cat コマンドの代替である bat の紹介です。

https://github.com/sharkdp/bat

ファイルの拡張子に応じてソースコードを色付けして表示してくれます。また less のようなページャの機能も持っており、行数の長いファイルを渡すと自動でページャモードで開いてくれます。

hexyl

hexyl はバイナリダンプコマンド od の代替コマンドです。bat の開発者と同じ方が開発しています。

https://github.com/sharkdp/hexyl

バイナリをダンプすること自体があまり多くないかもしれませんが C++ を使った低レイヤの開発をしていると、まれにバイナリの中をダンプしたくなることがあります。

fd

続いては find コマンドの代替である fd です。こちらも bat と同じ方が開発しています。

https://github.com/sharkdp/fd

fd は検索速度の速さがウリの検索コマンドです。find に比べるとかなり速いです。検索時に .gitignore で指定されたディレクトリは自動で無視してくれる機能が付いています(無視しないようにすることもできます)。

procs

procsps の代替コマンドです。

https://github.com/dalance/procs

--tree を付けると親プロセス・子プロセスの関係をツリー表示してくれます。

ripgrep

ripgrepgrep の代替コマンドです。

https://github.com/BurntSushi/ripgrep

コマンド名は rg となっています。fd と同じく、速さがウリになっています。また Visual Studio Code のクイックオープン (Ctrl + P) でも ripgrep が使用されています。

まとめ

CLI がカラフルだと視認性が向上するので、開発もしやすくなるのではないかと思います。ぜひお試しください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む