zshやら便利コマンドのあれこれ備忘録。alias書いたり.zshrc読み書きする用。
キーバインドを追加する
function fuga() {
# some code
}
zle -N fuga
bindkey '^Z' fuga
zle -Nで関数fugaをウィジェット登録して、bindkeyで登録したウィジェットをキーにバインドする。
ワイルドカードの展開をしない
noglob somecommand
例
$ ls * # ワイルドカードが展開される
file1 file2
$ noglob ls * # ワイルドカードが展開されない
ls: *: No such file or directory
文字列操作
文字列置換
echo 'hogehoge' | sed -e 's/hoge/fuga/g'
echo 'hogehoge' | perl -pe 's/hoge/fuga/g'
列で切り出し
echo 'hoge\tfuga' | awk '{ print $2 }'
条件切り出し
echo 'aaa\nbaa\ncdd\nddd\nedd' | sed -n '/aa/p' # aaにマッチした行のみ表示
echo 'aaa\nbaa\ncdd\nddd\nedd' | sed -n '/aa/,/ddd/p' # aaにマッチした行からdddにマッチした行まで
echo 'aaa\nbaa\ncdd\nddd\nedd' | sed -n '2,4p' # 2〜4行目を表示
条件削除
echo 'aaa\nbaa\ncdd\nddd\nedd' | sed -e '2,4d' # 2〜4行目を削除して表示
単純集計
echo '1\n2\n3\n4' | awk 'BEGIN{ sum = 0 } { sum += $1 } END{ print sum }'
条件集計
echo '1\n2\n3\n4' | awk 'NR > 2 { sum += $1 } END{ print sum }' # 2行目以降の集計
echo 'a 1\nab 2\ncc 3\nabd 4' | awk '$1~/ab/ { sum += $2 } END{ print sum }' # 正規表現にマッチしていた行だけ集計
aliasの定義とグローバルエイリアス
alias somename='somecommand'
-gをつけるとグローバルエイリアスでどこの個所に書いても動く
例
alias -g G='| grep'
echo 'hoge' G 'og' # => echo 'hoge' | grep 'og'
変数のsubstring
${var:index}
${var:index:length}
例
hoge='123456'
echo ${hoge:2:2}
変数計算
$((1+2))
expr 2 + 3 # 乗算の場合はnoglobてワイルドカード展開されないように注意
小数計算を含む場合はbcコマンドを使う
echo "1 + 2" | bc
小数点以下切り捨て
printf '%d' 123.456
echo 123.5001 | awk '{ printf "%d", $1 }'
四捨五入
echo 123.5001 | awk '{ printf "%d", ($1+0.5) }'
変数展開
# varが未定義 or 空文字であればdefaultの値を返し、そうでなければvarの値を返す
${var:-default}
# varが未定義 or 空文字であればdefaultの値を返しつつ、varに値を代入。そうでなければvarの値を返す。
${var:=default}
${var:=default}を使うときはそのままだと値が評価された後にコマンドとして再度評価されるので、何もしないコロンコマンドでエラーを回避すると良い
: ${hoge:="aaa"}
変数の文字列長
${#var}
setコマンド
引数を再セットできたり色々できるset $(date '+%Y %m %d')
echo $1 # year
echo $2 # month
echo $3 # day
zshあれこれ
ZLE
キーバインドで関数を呼び出したときに、現在のzshに入力されているバッファの値を参照することができる- BUFFER => バッファ全体の値
- LBUFFER => カーソルから左の値
- RBUFFER => カーソルから右の値
- CURSOR => カーソルの位置
$ 1234567890 # カーソルに5を合わせてctrl-zを押す
BUFFER=1234567890
LBUFFER=1234
RBUFFER=567890
CURSOR=4
BUFFERを操作したり、入力値をみてショートカットキーの振る舞いを変えたりすることが可能。
.zshrc vs .zshenv
.zshrcは対話シェルで読み込まれるが、シェルスクリプトの実行時には読み込まれない。シェルスクリプト実行時にも読み込みたい場合は.zshenvに書くzshでコメントを打つとbad patternと怒られる
hoge:1: bad pattern: #
この場合は、以下の設定を.zshrcなどに入れればOK
setopt interactivecomments
nocorrect
zshはタイポと思われる入力コマンドに対して正そうとしてくる。$ nslooku
zsh: correct nslooku to nslookup [nyae]?
このお伺いを無効にするのがnocorrectコマンド
nocorrect somecommand
autoload
zshの関数を遅延読み込みする仕組み。ファイル名を関数名、ファイル内のスクリプトを関数の処理として関数が登録される。検索対象のディレクトリは環境変数FPATHで管理される。autoload -U compinit
はcompinitという補完をする関数を遅延読み込みしてくれる(Uオプションを付けるとaliasの展開をしない=自分の作ったaliasが関数内に干渉することがなくなる)
PROMPT
プロンプトを変更したい場合はPROMPT変数をいじるとか環境変数ベースで色々できる。ビルトインコマンド
- history コマンドは fc -l と同じらしい
- declare コマンドは typeset と同じらしい
コマンドの有無
$commands => パスの通ってるコマンドのハッシュ$commands[command_name] => コマンドのパス
$+commands[command_name] => パスの通ってるコマンドが存在すれば1、そうでなければ0
その他便利なコマンド
expect
対話シェルでの各入力を自動化できる。vagrantだとこんな感じで書けるexpect -c "
set timeout 200
spawn vagrant up
expect \"Password:\"
send \"${PW}\n\"
expect eof exit
"
jq
json操作を色々やるコマンド。使い方は省略。nkf
文字エンコードを操作するコマンドurlエンコード
echo "テスト" | nkf -WwMQ # UTF-8で読み込んで(W)、quotedなMIMEエンコード(MQ)してUTF-8で出力する(w)
urlデコード
```bash
echo "%E3%83%86%E3%82%B9%E3%83%88" | tr % = | nkf -WwmQ # UTF-8で読み込んで(W)、quotedなMIMEデコード(mQ)してUTF-8で出力する(w)
echo "%E3%83%86%E3%82%B9%E3%83%88" | nkf -w --url-input # URLデコードして(--url-input)、UTF-8で出力(w)
```
base64
文字通りbase64エンコード、デコードするコマンド ```bash echo "hoge" | base64 # encode echo "aG9nZQo=" | base64 -d # decode ```peco
インクリメンタルサーチをするコマンド。これとkeybind、alias、function、各種文字列操作を組み合わせるとめっちゃ捗る。 たとえばこんな感じで書くとディレクトリをインクリメントサーチして選択したディレクトリに移動できる。 ```bash cd $(find . -maxdepth 1 -type d | peco) ``` keybind+ZLEの変数と組み合わせると更に便利 ```bash peco --query ${LBUFFER} # --queryはデフォルトの検索文字列 ```xargs
標準入力を引数に展開するコマンド。使い方は省略。pbcopy
macOS限定コマンド。標準入力をクリップボードにコピーする。Clipy等のクリップボードアプリと組み合わせると更に便利。GNUのdate
N日前とかの設定が簡単にできるので便利 ```bash date --date '1 day ago' '+%Y/%m/%d' ```参考URL
- A User's Guide to the Z-Shell
- zsh: 17 Shell Builtin Commands
- コマンドライン編集機能 Zsh Line Editor を使いこなす - Qiita
- bashのsetコマンドで覚えておきたい使い方9個 | 俺的備忘録 〜なんかいろいろ〜
- Shell Command Language
- .zshenvと.zshrcの役割 - Qiita
- zshで、コマンドライン実行時にもコメントを使えるようにする - minus9d's diary
- 環境に依存しないワンライナーを書くならsedよりperlの方がいい - Qiita
- zshのグローバルエイリアス - Qiita
- .zshrcで見かけるautoloadの意味と使い方 - Qiita
- Ubuntu Manpage: nkf - Network Kanji Filter