Last-modified: 2016-08-26 (金) 09:44:03
bash/チートシート

標準出力、標準エラー出力の一括リダイレクト

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
-
!
-
!
 
-
!
# 新規
<コマンド> &> <出力先パス>
# 追記
<コマンド> &>> <出力先パス>
 
# 古い書き方(追記)
<コマンド> >> <標準出力先パス> 2>&1

aliasを無視してコマンド実行

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
-
!
-
!
 
-
!
# cpやmvにaliasで-iがついてる環境で、大量上書きする場合などに使う
 
# 先頭に\をつける
\<コマンド> <...>
 
# フルパスで実行
<コマンドフルパス> <...>

エラー処理

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
-
!
 
 
 
 
-
!
 
 
 
 
-
|
|
|
!
 
 
-
|
|
|
|
|
|
!
 
 
# コマンド毎にエラー処理をしていると見づらい
<コマンドA> || { echo "[!!ERROR!!] failed to コマンドA"; exit 1; }
<コマンドB> || { echo "[!!ERROR!!] failed to コマンドB"; exit 1; }
<コマンドC> || { echo "[!!ERROR!!] failed to コマンドC"; exit 1; }
<コマンドD> || { echo "[!!ERROR!!] failed to コマンドD"; exit 1; }
 
# 処理の塊毎にエラー処理をした方が見やすい
<コマンドA> &&
<コマンドB> &&
<コマンドC> &&
<コマンドD> || { echo "[!!ERROR!!] failed to hoge"; exit 1; }
 
# 注意:
# find -exec内(別プロセス)で失敗してもfindは成功している場合、$?(直前のコマンドの終了ステータス)は0
# find + while readか、find + xargsを使う
# 例1. find + while read
<コマンドA> &&
find . -type f -print0 | while read -r -d '' line; do <コマンドB> || exit 1; done &&
<コマンドC> || { echo "[!!ERROR!!] failed to hoge"; exit 1; }
# 例2. find + xargs
#      標準出力が多すぎると自動で分割して実行する
#      例では分割実行中に失敗するとそこで終了するため効率は良い
#      ただし、<コマンドA>で失敗しても「[!!ERROR!!] failed to huga」が出力されることに注意
#      分割実行中に失敗してもfindの行を全て回して良いならば、下記の記述でよい
#      (詳しくはman xargsの「終了ステータス」の項を参照)
#      find . -type f -print0 | xargs -0 <コマンドB> &&
<コマンドA> &&
find . -type f -print0 | xargs -0 <コマンドB> || { echo "[!!ERROR!!] failed to huga"; exit 1; }
<コマンドC> || echo "[!!ERROR!!] failed to hoge"; exit 1;

ヒアドキュメントでインデント

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
-
!
 
 
 
# [<<-]とすれば、ヒアドキュメントの先頭タブを無視する
ssh -t hoge <<-END
    <コマンド>
    <コマンド>
END

パス操作

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
-
!
 
-
!
 
-
!
 
 
-
|
!
-
!
# フルパス化
ans=$(cd $target && pwd)
 
# 末尾の/を除く
ans=${$target%%/}
 
# ファイル名(拡張子あり)のみ取得
ans=`basename $target`
ans=${$target##*/}
 
# ファイル名(拡張子なし)のみ取得
# 拡張子がわかっている場合はこれが確実
ans=`basename $target .png`
# パスによっては誤作動する可能性があり
ans=`basename ${$target%%.*}`

SSH/SFTPで複数行の実行

接続先設定はSSH/接続を簡単にしたいを参照

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
-
!
 
 
 
 
 
# ヒアドキュメントを使う
ssh -t <接続先> $envName <<-END
    <コマンド> &&
    <コマンド> &&
    <コマンド>
END
if [ $? -ne 0 ]; then echo "[!!ERROR!!] failed to hoge"; exit 1; fi

現在日時を任意のフォーマットで取得

Everything is expanded.Everything is shortened.
  1
 
ans=`date +%m%d%H%M%S`

パスが不定なバイナリをシバンで指定する

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
-
|
|
!
-
|
# 環境変数PATHを使ってバイナリ名を解決
# 環境変数PATHに依存するので意図しないバイナリが使用される可能性に注意
#!/usr/bin/env <バイナリ名>
 
# 例
#!/usr/bin/env python

コマンド履歴の検索

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
 
 
-
|
|
|
!
Ctrl + r <検索ワード>
 
# Ctrl + rを押すたびに、古い履歴へ
# Ctrl + sを押すたびに、新しい履歴へ
# Ctrl + sが画面停止に割り当てられていたら(stty -a | grep stopでstop = ^Sとなっていたら該当)
# ↓を.bashrcにでも書いておけば幸せになれる
stty stop undef