tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

シェルスクリプトまとめ

シェルスクリプトについてのまとめ (随時更新)

1. シェルスクリプトの書き方

  • ファイルに書くときは文頭に#/usr/bin/shを書く。
  • コメントは行頭に#を書く。
  • プログラムにシェルスクリプトの出力を渡すときは`で囲めばいい。
    • eg.python3 -c "print(\"`echo $PWD`\")"

2. ファイルの圧縮、展開

  • 展開
tar xvf hoge.tar
unzip hoge.zip

3. grep

拡張子を指定するにはgrep -r --include=".cpp" patternとする。

正規表現 - tak0kadaの何でもノートに移動。

4. パーミッション、所有者

# パーミッションの変更
chmod -R [再帰] 775 dir
# 所有者の変更
chown -R [再帰] username dir
# 所属グループの変更
chgrp -R [再帰] groupname dir

パーミッションについてはファイルのアクセス権についてにまとめた。

5. 並列処理

pythonはGILがかかっているし、Rでも特に何もしなければ並列実行はしてくれない。どちらもmultiprocessing、snowで可能だがシェルスクリプトを利用すれば、計算が独立な場合に限るが簡単に並列計算ができる。

xargsを使う方法

xargs -L [コマンドに渡す引数の最大個数] -P [並列実行できる最大数 (0で可能なだけ最大数)]

yes 1 | head -n 10 | xargs -L 1 -P 0 sleep
yes 1 | head -n 10 | xargs -L 1 -P 1 sleep

(for i in 1 2 3 4; do echo $i; done) | xargs -L 2 -P 0 echo
(for i in 1 2 3 4; do echo $i; done) | xargs -L 1 -P 0 echo

バックグラウンドに飛ばす方法(1つ目との違いは不明)

dosomething &

for i in 1 2 3 4; do python veryheavy.py $i &; done
for i in 1 2 3 4; do R --vanilla --slave --args $i < veryheavy.R &; done

Gnu Parallelを使う方法

リンクのみ: GNU Parallelがすごすぎて生きるのがつらい

6. プロセスの表示、終了

ps aux
# 強制終了
kill -9 pid
# 再起動
kill -HUP pid

7. ネットワーク関連

  • DNSサーバーの確認: dig
  • ネットワーク設定: /etc/network/interfaces

8. エラー処理

  • set -e: exit 0以外で停止する
  • set -u: 未定義変数があれば停止する
  • set -x: 実行時情報を表示する
  • set +e: set -eを取り消す
  • set -euxo pipefail: パイプの中のエラーでも停止
  • lspci | grep -i nvidia || :: ||:||trueでエラーを握りつぶす

参考: シェルスクリプトを書くときはset -euしておく - Qiita

9. シェルスクリプトからPythonを起動する

#!bin/sh
"""
ここにシェルスクリプトを書く -> このファイルをpythonインタプリタで実行
"""
ここにpythonスクリプトを書く