2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記事投稿キャンペーン 「2024年!初アウトプットをしよう」

「Efficient Linux コマンドライン」を読んだ際の個人的メモ

Last updated at Posted at 2024-01-30

この記事について

Efficient Linux コマンドライン」を読んだ際、学びになったことについて自分用に整理しておきます。

個人的にはCDPATHBashのTab補完を利用するが面白かったので、聞いたことがない人はぜひご覧ください。

入力と出力のリダイレクト

記法 説明
1> stdoutのリダイレクト
2> stderrのリダイレクト
&> 両方をリダイレクト

以下例

test.c
#include <stdio.h>
int main(void) {
    printf("stdout\n");
    fprintf(stderr, "stderr\n");
    return 0;
}
bash
$ ./test 1> stdout.txt
$ ./test 2> stderr.txt

評価を無効にする

記法 説明
'' 範囲内の全てを文字として扱う
"" いくつかの記号を除いて範囲内の全てを文字として扱う
\ バックスラッシュの次にある文字を文字通りに扱う

例えば「$HOME」はシングルクオートでは文字列として表示され、ダブルクオートではホームディレクトリとしてシェルに展開されます。

bash
$ echo "$HOME"
/home/user

$ echo '$HOME'
$HOME

CDPATH

(追記: @ko1nksm さんよりexportは不要とのご指摘を頂きまして、修正しました。)

.bashrcかなんかに環境変数としてCDPATHを追記することで、普段使いする深いディレクトリへと簡単に移動ができます。個人的にはこれがとても面白く、GitHubにある.bash_personalとgcdp(ホームディレクトリ配下のディレクトリと、ホーム上のディレクトリを絶対パスとして文字列で返すシェルスクリプト)なども参考にしてみてください。

.bashrc
#.bashrcなどへ追加するスクリプト
CDPATH=行きたいディレクトリへの絶対パス

例えばあなたが
/home/user
にいるとして、その配下にある
/home/user/dir1/dir2/dir3 ぐらいに進みたいとしたら
愚直にパスを手打ちするのではなく、

.bashrc
CDPATH=/home/user/dir1/dir2/dir3

と.bashrcに追記して読み込ませることで

bash
$ pwd
/home/user

$ cd dir3
$ pwd
/home/user/dir1/dir2/dir3

こう出来るのです。

効率よくディレクトリへ戻る

記法 説明
cd - 移動する直前のディレクトリへ戻る
pushd 現在いるディレクトリをスタックへプッシュし、指定したディレクトリへ移動する
popd スタックからディレクトリをポップし、かつそこへ移動する
dirs ディレクトリのスタックを見る

bash
$ pwd 
/home/user

$ pushd /home/user/dir1/
~/home/user/dir1/ ~/home/user

$ dirs
 0 ~/home/user/dir1
 1 ~/home/user

$ popd
~/home/user

リストに関するテクニック

記法 説明
&& 2つ目のコマンドの実行は1つ目のコマンドに依存している
|| 1番目のコマンドが失敗したら、2つ目のコマンドを実行する
; 単に順番に実行する

bash
# dir1への移動が成功したらnew.txtを生成する
$ cd dir1 && touch new.txt

# dir1への移動が失敗したらエラーを吐く
$ cd dir1 || echo "failed to change dir"

# 単にnew.txtを生成した後に、helloを表示させる
touch new.txt ; echo "hello"

プロセス置換

記法 説明
<() ()の中にコマンドを記述することで、そのコマンドの実行結果(stdin)がファイルのように扱える

bash
# diffはファイルを要求するのでこう書ける
# 結果は何もない(文字列が同じなので)
# あるプログラムの実行結果をファイルに書き込んでdiffするより、echoの部分をあるプログラムに置き換えると便利
$ diff <(echo "Hello") <(echo "Hello")

プロセス制御に関するテクニック

記法 説明
& 実行するプログラムの最後につけると、標準出力がプロンプトへ出力されなくなる(バックグラウンドで動く)
bg &をつけたプログラムはctrl+zで一時停止可能。そしてbgで再開できる
fg バックグラウンドで動いているプログラムをフォアグラウンドへ戻す(標準出力が出てくるようになる)

bash
# GUIなアプリケーションをコマンドから起動すると、そのコマンドに入力できなくなるため、その解決などに使用する。
# keepassxcはただの例
$ keepassxc &

BashのTab補完を利用する

簡単に言えば、.bashrc内の関数やその他シェルスクリプトへの補完を有効化することで、実行時にTabによる入力の補完を行うことができるというものです。有効化するにはcompleteコマンドを使用するよう、シェルの起動時に確実に読み込まれるファイル(.bashrcなど)へ追記しておく必要があります。
詳しくはGitHubにあるページも参考にしてみてください。

最後に

  • 間違えていた場合にはご指摘ください。
  • 他にも様々なテクニックが記されていましたが、個人的にためになったというかすぐ使えて面白かったものだけを書きました。
  • 実は他にもgrepや正規表現、awkやsedなどの基本にも触れられていたのですが、こちらはこれらをより深く扱った書籍などを参考にするべきだとのことです。
2
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?