Wilhel

Wilhel

SHELLツールとスクリプト

ノート#

$_    # 前の引数
!!    # 前のコマンド
$?    # コマンドの終了コード
$#    # 引数の数
$@    # すべての引数
$$    # シェル自体のPID
$0    # 自身のファイル名

フォルダを作成して移動する

# mcd.sh
mcd(){
	mkdir -p "$1"
	cd "$1"
}

source mcd.sh
mcd test
# example.sh

#!/bin/bash
  
echo "Start program at $(date)" # 日付が置き換えられます
 
echo "Running program $0 with $# arguments with pid $$"
 
for file in "$@";do
        grep foobar "$file" > /dev/null 2> /dev/null
        # パターンが見つからない場合、grepは終了ステータスを持ちます
        # STDOUTとSTDERRをnullレジスタにリダイレクトします..
        if [[ "$?" -ne 0 ]]; then
                echo "File $file does not have any foobar, adding one"
                echo "# foobar" >> "$file"
        fi      
done

コマンドの使用方法を確認する:

  • tldr よりわかりやすい
sudo apt-get install tldr
mkdir -p ~/.local/share/tldr
tldr -u

ファイルを検索する

  • fd
sudo apt-get install fd-find
sudo ln -s $(which fdfind) /usr/bin/fd

コードを検索する

  • riggrep(rg)
sudo apt-get install riggrep

# requestsライブラリを使用しているすべてのファイルを検索する
rg -t py 'import requests'
# shebangを書いていないすべてのファイル(隠しファイルを含む)を検索する
rg -u --files-without-match "^#!"
# fooの文字列を検索し、それに続く5行を表示する
rg foo -A 5
# マッチした統計情報を表示する(マッチした行とファイルの数)
rg --stats PATTERN

一般的なフジツケツール

  • fzf
sudo apt-get install fzf

ps aux | fzf
fzf --query "sh"

フォルダのナビゲーション

  • fasd
  • autojump
  • tree
  • broot
  • nnn
  • ranger

練習#

現在の位置を保存する

#!/bin/bash
marco(){
	echo $(pwd) > ~/dev/class/missing-semester/marco_history.log
	echo "save pwd $(pwd)"
}
polo(){
	cd "$(cat ~/dev/class/missing-semester/marco_history.log)"
}

#!/bin/bash
marco() {
	export MARCO=$(pwd)
}
polo() {
	cd "$MARCO"
}

エラーをデバッグして出力をキャプチャする

# buggy.sh

#!/usr/bin/env bash

n=$(( RANDOM % 100 ))

if [[ n -eq 42 ]]; then
        echo "Something went wrong"
        >&2 echo "The error was using magic numbers"
        exit 1
fi

echo "Everything went according to plan"

# debug_while.sh
#!/usr/bin/env bash
count=1

while true
do
        ./buggy.sh &>> out.log
        if [[ $? -ne 0 ]]; then
                # cat out.log
                echo "failed after $count times"
                break
        fi
        ((count++))
done

# debug_for.sh
#!/usr/bin/env bash
for ((count=1;;count++))
do
        ./buggy.sh &>> out.log
        if [[ $? -ne 0 ]]; then
                # cat out.log
                echo "failed after $count times"
                break
        fi
done

# debug_until.sh
#!/usr/bin/env bash
count=0
until [[ "$?" -ne 0 ]];
do
        count=$((count+1))
        ./buggy.sh &>> out.log
done
# cat out.log
echo "found error after $count runs"

フォルダ内のすべての HTML ファイルを再帰的に検索し、それらを zip ファイルに圧縮する

mkdir -p html_root/html
touch html_root/{1..10}.html
touch html_root/html/xxxx.html
fd --extension html | xargs -d '\n' tar -cvzf html.zip

フォルダ内で最近使用されたファイルを再帰的に検索するコマンドまたはスクリプトを作成する

find -type f -print0 | xargs -0 ls -lt | head -1
# find -print0 は、クエリの各結果の後にNULL文字を追加し、デフォルトの改行文字を置き換えます
# xargs -0 xargsコマンドはNULLを区切り文字として使用します
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。