物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)
前回記事
■ 参考 : 【crontab】を使ってジョブを自動化させたメモ
この後も度々crontabにお世話になっていた
そして、今日設定ファイルを修正しようとして間違ってcrontab -rを実行してしまった
rオプションはcrontabの設定ファイルをremoveするためのオプション(要するに初期化)
なんでeの隣のrにしたんだよ・・・
初期化という意味でiとかでいいやろ・・・
普通に殺意沸いたわ・・・実行してしまった自分に・・・ ガチ凹み
twitterで悲鳴をあげていたら、プロからgitで管理しろとありがたい助言を頂いた・・・
cronの設定ファイルも git で管理しましょう
— Jun Koda (@junkoda) 2019年6月12日
ただ、/var/spool/cron/crontab/ は管理者権限がないと見れないらしいので今回は使えない・・・
とりあえず.cshrcに
alias crontab 'crontab -i'
と追記しておいたこれでcrontab -rとしても「本気か?」って確認される
crontabからrオプションを駆逐するのは次回に持越し
PR
scpするときに転送先に、そのディレクトリがなかった
scpのオプションでなんとかできるのかな〜と思ったけど、sshでできるらしい
アカウント名 hoge
ssh先 hoge.ac.jp
実行するコマンド mkdir new_dir
ツイート
scpのオプションでなんとかできるのかな〜と思ったけど、sshでできるらしい
ssh hoge@hoge.ac.jp mkdir new_dir
アカウント名 hoge
ssh先 hoge.ac.jp
実行するコマンド mkdir new_dir
% su
rootに切り替える
ただし今いるディレクトリからは動かない
% su -
rootに切り替える
ただし今いる場所からルートのホームディレクトリに移動する
rootに切り替える
ただし今いるディレクトリからは動かない
% su -
rootに切り替える
ただし今いる場所からルートのホームディレクトリに移動する
■ 参考 : su と su - の違い
違いは - の有無
-を付けるとrootの設定ファイルを読み込む
-をつけないと設定ファイルを読み込まないので、一般ユーザーの設定したPATHとかがそのまま引き継がれる
NISを使ってパスワードを共有している計算機を使う機会があった
hogeというユーザを追加する方法は
% su
% useradd -m -g users hoge
% passwd hoge
% cd /var/yp
% make
これでOK% useradd -m -g users hoge
% passwd hoge
% cd /var/yp
% make
ユーザが自分自身でNISで共有するパスワードを変更したいときは
%yppasswd
ユーザが自分自身でログインシェルを変更したいときは
%ypchsh
sshfsコマンドを使えばOK
Macへのインストールはportでできる
(Macでは作らなくてもいけたけど、Linuxだと事前に用意必須)
マウントを解除するときは
uオプションなしだと
fusermount: old style mounting not supported
というエラーができて、マウントを解除できなかった
それでも無理ならpsでPIDを調べてkillコマンドで終了させる
sshfsが今やろうとしてることの要件に叶うかは微妙かも?
ssh先のファイルの処理は全部手元でやるので、ファイルを全部scpしてきてるのと変わらなかった
毎回scpしなくても1度sshfsするだけでよくなるのが利点かも
(2019/07/26 追記)
sshfsで接続したときに、接続先のディレクトリをread-onlyで接続したいときは
(2020/03/02 追記)
接続を解除しようとしたら次のエラーが出た
接続を解除は
(2020/04/06 追記)
エラーが出て勝手に接続が切れていた
fusermount -u hoge
で接続を切ってから再接続するとエラーが消えた
(2020/04/06 追記)
sshfsでマウントが接続切れになったときに自動的に復旧するオプションを見つけた
■ 参考 : SSHFS - auto reconnect
■ 参考 : サーバ起動時にマウント
ツイート
Macへのインストールはportでできる
sshfs @2.10 (fuse)
SSH filesystem for FUSE
使い方はsshとほぼ同じだけど、事前にローカル(手元)でディレクトリを作っておいた方がいいSSH filesystem for FUSE
(Macでは作らなくてもいけたけど、Linuxだと事前に用意必須)
sshfs ユーザ名@ssh先のホスト名:マウントするディレクトリへのPATH ローカルでのマウント位置
例えば
mkdir foo
sshfs your_name@hoge.com:/somewhere foo
Macの場合、最初に警告が出て環境設定での許可が必要だった(スクショ撮り忘れた)例えば
mkdir foo
sshfs your_name@hoge.com:/somewhere foo
マウントを解除するときは
diskutil unmount foo
fusermountを使ってfusermount -u foo
でも解除できるuオプションなしだと
fusermount: old style mounting not supported
というエラーができて、マウントを解除できなかった
それでも無理ならpsでPIDを調べてkillコマンドで終了させる
sshfsが今やろうとしてることの要件に叶うかは微妙かも?
ssh先のファイルの処理は全部手元でやるので、ファイルを全部scpしてきてるのと変わらなかった
毎回scpしなくても1度sshfsするだけでよくなるのが利点かも
(2019/07/26 追記)
sshfsで接続したときに、接続先のディレクトリをread-onlyで接続したいときは
sshfs your_name@hoge.com:/somewhere foo -o ro
みたいにオプションを付ければOK(2020/03/02 追記)
接続を解除しようとしたら次のエラーが出た
fusermount: failed to unmount /home/hoge/data: Device or resource busy
接続を解除は
sudo umount -l data
(2020/04/06 追記)
エラーが出て勝手に接続が切れていた
cannot access 'hoge': Transport endpoint is not connected
一度fusermount -u hoge
で接続を切ってから再接続するとエラーが消えた
(2020/04/06 追記)
sshfsでマウントが接続切れになったときに自動的に復旧するオプションを見つけた
sshfs your_name@hoge.com:/somewhere foo -o ro -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
■ 参考 : SSHFS - auto reconnect
■ 参考 : サーバ起動時にマウント
■ 参考 : scpの使い方 -l オプション (帯域制限)
■ 参考 : rsync, wget, curl, scp に速度制限をかける方法まとめ
scp -l 8192 hoge.txt name@where:
単位は [Kbit/s]
メモ
2MB ~ 16000Kbit
1MB ~ 8000Kbit
500KB ~ 4000Kbit
100KB ~ 800Kbit
設定ファイルが読めない状況でファイル修正をしないといけなくて、やむを得ずviを使った
:qが終了なことは覚えてたけど(覚えてないと詰む)、今回は修正をしないといけなかった
修正はiで編集モード変更に切り替えて行うっぽい
モードを閲覧モードに帰るときはESC
:q セーブせずに終了
:q セーブせずに強制終了
:w セーブするが終了しない
:wq セーブして終了
検索や置き換えが簡単にできそう
今はずっとemacsを使ってるけど、正直emacsを使いこなしてるわけではないからviでもいいのかもしれん
最近はそんなにコードを書けていないから、もっと頑張らねば
■ 参考 : viエディタの使い方
めちゃくちゃ便利だわ、xargs
■ 参考 : xargsコマンドで覚えておきたい使い方・組み合わせ7個(+1個)
基本的には
コマンド1 | xargs コマンド2
パイプと似てる
パイプだと ls *.txt | wc とかみたいに左のコマンドの結果をより右に渡して実行される
xargsも同じような感じだけど、それにいろいろとオプションをつけてさらに高度なことができる
自分的に便利だと思ったのは
xargs -p : 実行するか毎回確認できる
xargs -P 2 : 同時にプロセスを複数走らせられる、この場合は2
xargs -d区切り文字 : デフォルトだとスペースになってる、これをアンダーバーとかにできる
ひとまずメモ
ただのメモ
(2023/08/15 追記)
リダイレクトで使いたい時は、
ツイート
echo "hogehoge" 1>&2
(2023/08/15 追記)
リダイレクトで使いたい時は、
echo "hogehoge" >> hoge.txt 1>&2
このブログで初めてcrontabのことを書く〜
crontabは定期的になんらかのコマンドを走らせるときに便利、ということは度々聞いてたけど
今回始めて使うことになってしまった・・・・
今までどうしてたかというと
アナログ人間的発想って感じだ・・・ 別の言い方をすると発想がおじいちゃん
自分が走らせたかったのはただのシェルスクリプト
自分のシェルで動くことは確認済
crontabを走らせる設定は以下のコマンドで書く
次のようにcrontabe -eで設定する
ls -ltなどでhoge.txtの最終更新日が確認できる
現在の設定は
左から
コメントアウトをしたかったら、#でそのジョブを止めれる
この次に、自分のシェルスクリプトを使って動作テストをする
が、うまく動いてくれない
何が原因で動いてくれないのかはエラー出力や標準出力がないからわかりにくい
そこで、
これでエラーメッセージが読めるようになる
このあとでトラブったのがPATHやLD_LIBRARY_PATHなどの環境変数の設定
crontabを実行するときは、PATHなどがすべてリセットされてほとんど空の状態になる
シェルスクリプトを動かすのに必要なのはPATHやLD_LIBRARY_PATHくらいなのでそれをセットする
セットする方法は以下のページに何種類も提案されてる
■ 参考 : cronジョブを作るのにいつものやり方でいいんですか?
■ 参考 : cron実行時の環境変数を設定
■ 参考 : シェル上だと動くのに、CRONに登録したら動かない!!!なんでだぁー!!!を解決する為の記事です。
自分はcrontabにそのまま直書きする方法にした
(2019/06/12 追記)
crontab -rを実行して設定ファイルの爆破に成功した方へ
■ 参考 : 【crontab】のrオプションを誤って実行してしまった人向け記事
毎時15分じゃなくて、本当に15分ごとに何かを実行したいときは
■ 参考 : 時間をずらしてcronを実行する
1-56/15とすれば毎時1分, 16分, 31分, ・・・とかもできるらしい
ツイート
crontabは定期的になんらかのコマンドを走らせるときに便利、ということは度々聞いてたけど
今回始めて使うことになってしまった・・・・
今までどうしてたかというと
sleep 3600; echo "hoge"
みたいな感じで手作業で待機させて走らせていた・・・アナログ人間的発想って感じだ・・・ 別の言い方をすると発想がおじいちゃん
自分が走らせたかったのはただのシェルスクリプト
自分のシェルで動くことは確認済
crontabを走らせる設定は以下のコマンドで書く
crontab -e
EDITORという変数を設定していないと、viとかで編集することになるので設定しておくsetenv EDITOR "emacs -nw"
まずは動作テスト次のようにcrontabe -eで設定する
* * * * * echo "hoge" > ~/hoge.txt
これで、1分ごとにhoge.txtが更新されるはずls -ltなどでhoge.txtの最終更新日が確認できる
現在の設定は
crontabe -l
で表示できる左から
[分, 0~59] [時, 0~23] [日, 1~31] [月, 1~12] [曜日, 0~7, 0=7=日曜, またはsun~satでも指定できる] [コマンド]
に対応するコメントアウトをしたかったら、#でそのジョブを止めれる
この次に、自分のシェルスクリプトを使って動作テストをする
が、うまく動いてくれない
何が原因で動いてくれないのかはエラー出力や標準出力がないからわかりにくい
そこで、
* * * * * echo “hoge" >>~/log1.txt 2>> ~/log2.txt
のようにして、標準出力と標準エラーをファイルに書き出すこれでエラーメッセージが読めるようになる
このあとでトラブったのがPATHやLD_LIBRARY_PATHなどの環境変数の設定
crontabを実行するときは、PATHなどがすべてリセットされてほとんど空の状態になる
シェルスクリプトを動かすのに必要なのはPATHやLD_LIBRARY_PATHくらいなのでそれをセットする
セットする方法は以下のページに何種類も提案されてる
■ 参考 : cronジョブを作るのにいつものやり方でいいんですか?
■ 参考 : cron実行時の環境変数を設定
■ 参考 : シェル上だと動くのに、CRONに登録したら動かない!!!なんでだぁー!!!を解決する為の記事です。
自分はcrontabにそのまま直書きする方法にした
50 10 * * * PATH=/usr/local/bin:/usr/bin:/bin:$HOME/bin:. LD_LIBRARY_PATH=/usr/local/lib/:$HOME/local/lib/ hoge.sh >>~/log1.txt 2>> ~/log2.txt
これで動いた(2019/06/12 追記)
crontab -rを実行して設定ファイルの爆破に成功した方へ
■ 参考 : 【crontab】のrオプションを誤って実行してしまった人向け記事
毎時15分じゃなくて、本当に15分ごとに何かを実行したいときは
*/15 * * * * PATH=/usr/local/bin:/usr/bin:/bin:$HOME/bin:. LD_LIBRARY_PATH=/usr/local/lib/:$HOME/local/lib/ hoge.sh >>~/log1.txt 2>> ~/log2.txt
■ 参考 : 時間をずらしてcronを実行する
1-56/15とすれば毎時1分, 16分, 31分, ・・・とかもできるらしい
カレンダーを英語で表示するには、
% env LC_TIME=C cal
June 2018
Su Mo Tu We Th Fr Sa
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 30
June 2018
Su Mo Tu We Th Fr Sa
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 30
今の言語環境とかを引き継いで起動する場合は
% cal
6月 2018
日 月 火 水 木 金 土
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 30
6月 2018
日 月 火 水 木 金 土
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 30
■ calコマンドのオプション
cal -y
今年の1年分のカレンダーを表示する
cal -3
先月、今月、来月の3ヶ月分を表示する
cal 6 2019
2019年6月のカレンダーを表示
cal 29 6 2019
はダメだった
■ 過去記事 : 【多段ssh】するときに楽な方法を2つ紹介
まず、4年前の自分へ
「2つめは ~/.ssh/configを活用する方法
最後まで書ききる元気がなくなったので参考リンクだけ残しておきます」
と書いていますが、今はそれをガッツリ使っています
一歩ずつではあるが着実に成長してるでぇ〜
今回はパスワードなしでssh(scp)する方法についてメモしときます
■ 過去記事 : sshの設定(passwordなしでsshログイン(scp)する)
ここが一番分かりやすいです
ssh -Y yourname@hoge.co.jp
でログインできることも確認する
追加で他の人からファイルが見えないようにする設定がいるかと思ったけどいらなかった
(2018/07/11 追記)
もし複数の秘密鍵を持っておきたい場合は
このとき、デフォルトでは~/.ssh/id_rsaの秘密鍵が読み込まれるようなので、秘密鍵を接続先に応じて使い分けたい場合は ~/.ssh/configに次のように秘密鍵の場所を指定しておくと良い
IdentityFile ~/.ssh/id_rsa.home
ツイート
まず、4年前の自分へ
「2つめは ~/.ssh/configを活用する方法
最後まで書ききる元気がなくなったので参考リンクだけ残しておきます」
と書いていますが、今はそれをガッツリ使っています
一歩ずつではあるが着実に成長してるでぇ〜
今回はパスワードなしでssh(scp)する方法についてメモしときます
■ 過去記事 : sshの設定(passwordなしでsshログイン(scp)する)
ここが一番分かりやすいです
% ssh-keygen -t rsa
鍵の保管場所を聞かれる
デフォルトは~/.ssh/id_rsaなのでそのままenterを押して許可
パスフレーズを要求されるが、今はこれをなしにしたいのでEnterを押す
再度確認されるのでEnter
鍵が~/.ssh以下にできる
このうち公開鍵(public key)をssh先も転送する
% ssh-copy-id -i ~/.ssh/id_rsa.pub yourname@hoge.co.jp:
ログイン先にログインして、 ~/.ssh/authorized_keys というファイルがあればOK
実際に鍵の保管場所を聞かれる
デフォルトは~/.ssh/id_rsaなのでそのままenterを押して許可
パスフレーズを要求されるが、今はこれをなしにしたいのでEnterを押す
再度確認されるのでEnter
鍵が~/.ssh以下にできる
このうち公開鍵(public key)をssh先も転送する
% ssh-copy-id -i ~/.ssh/id_rsa.pub yourname@hoge.co.jp:
ログイン先にログインして、 ~/.ssh/authorized_keys というファイルがあればOK
ssh -Y yourname@hoge.co.jp
でログインできることも確認する
追加で他の人からファイルが見えないようにする設定がいるかと思ったけどいらなかった
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
(2018/07/11 追記)
もし複数の秘密鍵を持っておきたい場合は
% ssh-keygen -t rsa -f ~/.ssh/id_rsa.hoge
のようにして出力ファイル名を指定できるこのとき、デフォルトでは~/.ssh/id_rsaの秘密鍵が読み込まれるようなので、秘密鍵を接続先に応じて使い分けたい場合は ~/.ssh/configに次のように秘密鍵の場所を指定しておくと良い
IdentityFile ~/.ssh/id_rsa.home
% [[ `echo 'AAAAAAA' | grep 'B'` ]] && echo "with B" || echo "without B"
without B
% [[ `echo 'AAAAAAAB' | grep 'B'` ]] && echo "with B" || echo "without B"
with B
■ 参考 : 文字列Aに文字列Bが含まれるかwithout B
% [[ `echo 'AAAAAAAB' | grep 'B'` ]] && echo "with B" || echo "without B"
with B
ちょいちょい出力が違うけどメモ
find fig -maxdepth 2 -type f
■ 指定した深さのディレクトリorファイルのみを一覧する
-depthというオプションもあったので、それでいけるかと思ったけどダメ
しょうがないのでmindepthとmaxdepthの合わせ技で・・・・・
ツイート
sh-4.2$ ls -F fig | grep /
12113/
12114/
12115/
12116/
12118/
12134/
12113/
12114/
12115/
12116/
12118/
12134/
sh-4.2$ ls -l fig | grep ^d
drwxr-xr-x 2 usename hoge 4096 Jun 21 05:23 12113
drwxr-xr-x 2 usename hoge 131072 Jun 21 09:05 12114
drwxr-xr-x 2 usename hoge 4096 Jun 21 08:01 12115
drwxr-xr-x 2 usename hoge 131072 Jun 21 05:54 12116
drwxr-xr-x 2 usename hoge 131072 Jun 21 13:15 12118
drwxr-xr-x 2 usename hoge 4096 Jun 21 13:24 12134
sh-4.2$ ls -l fig | grep ^d | awk '{print $9}'
12113
12114
12115
12116
12118
12134
drwxr-xr-x 2 usename hoge 4096 Jun 21 05:23 12113
drwxr-xr-x 2 usename hoge 131072 Jun 21 09:05 12114
drwxr-xr-x 2 usename hoge 4096 Jun 21 08:01 12115
drwxr-xr-x 2 usename hoge 131072 Jun 21 05:54 12116
drwxr-xr-x 2 usename hoge 131072 Jun 21 13:15 12118
drwxr-xr-x 2 usename hoge 4096 Jun 21 13:24 12134
sh-4.2$ ls -l fig | grep ^d | awk '{print $9}'
12113
12114
12115
12116
12118
12134
sh-4.2$ find fig -maxdepth 1 -type d
fig
fig/12114
fig/12118
fig/12134
fig/12116
fig/12113
fig/12115
ディレクトリじゃなくてファイルが知りたいときはfig
fig/12114
fig/12118
fig/12134
fig/12116
fig/12113
fig/12115
find fig -maxdepth 2 -type f
■ 指定した深さのディレクトリorファイルのみを一覧する
-depthというオプションもあったので、それでいけるかと思ったけどダメ
しょうがないのでmindepthとmaxdepthの合わせ技で・・・・・
find fig -maxdepth 2 -mindepth 1 -type d | sort -r
find fig -maxdepth 2 -mindepth 1 -type f | sort -r
find fig -maxdepth 2 -mindepth 1 -type f | sort -r
実行ファイルが foo/hoge.txt というファイルを読み込んで解析をするとする
このとき、実行ファイルにfoo/hoge.txtと直書きして実行するとファイルが見つからないとエラーが出る
おそらくcondorが実行されるときに、実行ファイルを別の場所にそのままコピーして実行するので
カレントディレクトリで実行されるわけではないからこういうエラーが起こってる
じゃあ、foo/hoge.txt も一緒にコピーしてもらえばいいのではと思って少し調べた
以下のページに説明があった
■ 参考 : 2.5 Submitting a Job3
transfer_input_files = foo/hoge.txt
これでfoo/hoge.txtも転送されて解析されるかと思ったけど、ダメ
あとはサブミットファイルの中で
Initialdir = [今のでぃれくとり]
のようにもしてみたが、同じだった
結局、foo/hoge.txt を絶対PATHで書くことで解決した
quick lookで見れなくてイラッとした
まずはechoで本当に思ってるファイルがリストされてるのか確認
そのあと、mv で実際にリネームすればOK
#!/bin/sh
for i in `find . -name "*dat"`
do
mv $i ${i%.dat}.txt
#echo $i
done
for i in `find . -name "*dat"`
do
mv $i ${i%.dat}.txt
#echo $i
done
以前書いた記事のおさらい+まとめみたいな感じ
■ 参考 : 【シェルスクリプト】2の累乗をfor文で回す
■ 参考 : 【シェルスクリプト】exprを使わずにより早いfor文を書く
$(())という書き方は実はもっと色々とできるっぽい
↓の記事に詳しくまとめられている
■ 参考 : bashで四則演算( -×÷)や割り算のあまり(剰余)を求めるような簡単な計算をする
・四則演算
・余りを求める $(( 5 % 3 )) とか(今回はこれが使いたかった)
・累乗を求める
・偶奇の判定、$(( なんか & 1 ))で返り値が1なら奇数、0なら偶数
ただし、$(())の最大のデメリットは整数しか扱えないこと
小数を使いたい場合はbcコマンドを使う
またはawkとかでもOKか
■ 参考 : 【シェルスクリプト】bcコマンド
ツイート
■ 参考 : 【シェルスクリプト】2の累乗をfor文で回す
■ 参考 : 【シェルスクリプト】exprを使わずにより早いfor文を書く
$(())という書き方は実はもっと色々とできるっぽい
↓の記事に詳しくまとめられている
■ 参考 : bashで四則演算( -×÷)や割り算のあまり(剰余)を求めるような簡単な計算をする
・四則演算
・余りを求める $(( 5 % 3 )) とか(今回はこれが使いたかった)
・累乗を求める
・偶奇の判定、$(( なんか & 1 ))で返り値が1なら奇数、0なら偶数
ただし、$(())の最大のデメリットは整数しか扱えないこと
小数を使いたい場合はbcコマンドを使う
またはawkとかでもOKか
■ 参考 : 【シェルスクリプト】bcコマンド
まず終了ステータスについて
■ 参考 : exitコマンド(シェルを終了する)
シェルスクリプトの最後に
nを書かない場合は最後に実行したコマンドの終了コードを引き継いで正常終了する
nに数字以外を書くとエラー終了
nは0から255の数字を入れる
1のみエラー終了、それ以外は正常終了
■ 参考 : 終了ステータスを設定
終了ステータスは $? というシェル変数に代入されているので、その値を見て処理を分岐させればOK
ただし、そんな処理分岐をしなくても
command1が成功したら、command2を実行するという風に処理を進めたい場合は次のように書けばOK
コマンドが失敗した場合のみ進めるというのもあるが、こっちは使いみちがあんまりわからん
代替手段をcommand2とcommand3に書いておくのかな?
rm -f の終了ステータスは常に0になる
他のユーザのファイルを削除しようとした場合は1になる
とりあえずrm -f の終了ステータスは信用しないようにする
話は変わって、シェルスクリプトのset -eについて
■ 参考 : シェルスクリプトを書くときはset -euしておく
この記事ではset -euと書いてあるけど、自分が使いたいのはひとまず set -e
これはシェルスクリプトの中で、正常終了しないコマンドがあった場合はそこでシェルスクリプトの処理が止まる
set -uは未定義の変数を使おうとしたときに打ち止めしてくれるオプション
ある処理がうまくいってなくて、その結果未定義な変数があるときにちゃんと処理を止めてくれるという優れもの
ある処理1からある処理2まではset -eのオプションの機能を止めたい場合は
ツイート
■ 参考 : exitコマンド(シェルを終了する)
シェルスクリプトの最後に
exit [n]
と書いた場合はnが終了コードnを書かない場合は最後に実行したコマンドの終了コードを引き継いで正常終了する
nに数字以外を書くとエラー終了
nは0から255の数字を入れる
1のみエラー終了、それ以外は正常終了
■ 参考 : 終了ステータスを設定
終了ステータスは $? というシェル変数に代入されているので、その値を見て処理を分岐させればOK
ただし、そんな処理分岐をしなくても
command1が成功したら、command2を実行するという風に処理を進めたい場合は次のように書けばOK
command1 && command2 && command3
コマンドが失敗した場合のみ進めるというのもあるが、こっちは使いみちがあんまりわからん
代替手段をcommand2とcommand3に書いておくのかな?
command1 || command2 || command3
rm -f の終了ステータスは常に0になる
他のユーザのファイルを削除しようとした場合は1になる
とりあえずrm -f の終了ステータスは信用しないようにする
話は変わって、シェルスクリプトのset -eについて
■ 参考 : シェルスクリプトを書くときはset -euしておく
この記事ではset -euと書いてあるけど、自分が使いたいのはひとまず set -e
これはシェルスクリプトの中で、正常終了しないコマンドがあった場合はそこでシェルスクリプトの処理が止まる
set -uは未定義の変数を使おうとしたときに打ち止めしてくれるオプション
ある処理がうまくいってなくて、その結果未定義な変数があるときにちゃんと処理を止めてくれるという優れもの
ある処理1からある処理2まではset -eのオプションの機能を止めたい場合は
set +e
# ここからset -eを止めてる
#
#
#
set -e
# ここからset -eが機能してる
#
みたいにset +eを使えばOK# ここからset -eを止めてる
#
#
#
set -e
# ここからset -eが機能してる
#
条件分にコロンを使う
while :
do
# なんかする
done
do
# なんかする
done
条件分にtrueを使う
while true
do
# なんかする
done
do
# なんかする
done
最近何かのことを調べていて以下のブログにたどり着いた
色々とページを見てたら、目からウロコが落ちた
■ 参考 : 最近覚えたシェルスクリプトの小ネタ
「testコマンドを使うとフォークしてしまって大量に叩くとパフォーマンス悪い」らしい
つまり、if [ ]; thenのこと
その代用に挙げられていたのが
これを使って・・・・
ファイルがあるかどうかで分岐
判定を反転させたいときは ! を -dとか-fの前につければいい
あと&&とか||の後の処理を複数行に分けて書きたいときは{ } でくくればOK
(2019/06/21 追記)
ファイルの存在を確認するときにワイルドカードを使いたい
そういうときはlsのエラー結果を使えばいい
■ 参考 : ファイルの存在確認でワイルドカードを使う
ツイート
色々とページを見てたら、目からウロコが落ちた
■ 参考 : 最近覚えたシェルスクリプトの小ネタ
「testコマンドを使うとフォークしてしまって大量に叩くとパフォーマンス悪い」らしい
つまり、if [ ]; thenのこと
その代用に挙げられていたのが
[[ "$a" = "hoge" ]] && echo "hoge" || echo "fuga"
これを使って・・・・
ファイルがあるかどうかで分岐
[[ -f $file ]] && echo "file aru" || echo "file nai"
ディレクトリがあるかどうかで分岐[[ -d $dir ]] && echo "dir aru" || echo "dir nai"
[[ ]]と中身は絶対に半角スペースを開けないとエラーになるので注意判定を反転させたいときは ! を -dとか-fの前につければいい
あと&&とか||の後の処理を複数行に分けて書きたいときは{ } でくくればOK
(2019/06/21 追記)
ファイルの存在を確認するときにワイルドカードを使いたい
そういうときはlsのエラー結果を使えばいい
ls /hoge/*.txt >/dev/null 2>&1
if [ $? -ne 0 ]; then
# 存在しない場合
else
# 存在する場合
fi
if [ $? -ne 0 ]; then
# 存在しない場合
else
# 存在する場合
fi
■ 参考 : ファイルの存在確認でワイルドカードを使う
新しい計算機にログインして、ふいにcontrol+Dを押してしまいログアウトしてしまった・・・
.cshrcをまだ用意していないのが原因だった
.cshrcに
set ignoreeof
と書いておけばOKというか書いてある.cshrcをscpしていなかったからこうなっただけだった
何も知らずに偉い人の.cshrcを一部コピペしたりして使ってたけど、やはり先人は偉大だった
bashの場合は
IGNOREEOF=100
とかでcontrol+Dを100回まで無視するとか設定するらしいわかりやすくcontrol+Dについてまとめられているページ↓
■ 参考 : Ctrl-D の話
自分のログインパスワードを変更する時にchpasswdと打って、sudo権限いるやんけ〜〜〜
とか言ってたアフォおる?(私だ)
passwd は自分のアカウントのパスワードを変更するときに使う
chpasswd は管理者が一括で複数のユーザーのパスワードを変更するときに使うコマンド(つまりsudo権限は必要)
■ 参考 : 【 passwd 】 ユーザーのパスワードを変更する
■ 参考 : Linuxで一括でユーザーのパスワード設定を行う方法
chsh -s /bin/tcsh
新しいMacを手に入れました
ログインシェルがbashになってることに気づかず、あれ?あれ?と右往左往して原因に気づきました
terminalの環境設定からたぶん変えられるけど、chshってコマンドじゃなかった?
と思って使ってみたら、viの知識必須だったみたいで心が折れました・・・
ググったらchsh -s 〜〜〜でいけると知ったのでメモメモ
(2018/02/15 追記)
場合によってはsudoいるかも
その後再起動する
sudo chsh -s /bin/tcsh
昨年の作業ディレクトリを整理しててちょっと困った・・・
ls -lで見ると年が表示されないので2016年のディレクトリなのか2017年のディレクトリなのか判別できない
調べてみると
ls --full-time
でいけるっぽい一時的に
alias ll 'ls --full-time'
としてaliasに登録しておいて作業・・・他にもlsは色んな時刻の表示形式に対応している
■ 外部リンク : ls -l コマンドで年を表示したり、ファイルの日付の表示形式を変えるには。
■ 参考 : 統計屋のためのAWK入門
ここの「AWKでなんか色々統計処理をやってみた」というsectionにワンライナーでコマンドがまとめられてる
以前から使ってる別のワンライナーコマンドをまとめたページも貼ろうと思ったけど、
記事が別の場所に移動して怪しかったのでやめた
分散と標準偏差が便利
ダブルコーテーションじゃなくてバッククオートじゃないといけなかった
あとで気づいたけど、これ"あんちべ"さんだ・・・
別の記事に艦これの加賀さんが出て来ていたのでメモメモ
■ 面白い記事 : 自然言語処理の最新手法"word2vec"で艦これ加賀さんから乳を引いてみる
(2017/09/04 追記)
これで100000回並べ替えを行って、そこから先頭の100個のデータを抽出できる
元のソースコードは上記と同じリンク
srandは現在の時刻から初期シードを生成して、乱数生成を行うので
1秒以内に同じコードを実行するとまったく同じ結果になってしまう
この処理を何度も行うときはsleep 2とかを間に挟んだ方が良い
ツイート
ここの「AWKでなんか色々統計処理をやってみた」というsectionにワンライナーでコマンドがまとめられてる
以前から使ってる別のワンライナーコマンドをまとめたページも貼ろうと思ったけど、
記事が別の場所に移動して怪しかったのでやめた
分散と標準偏差が便利
ダブルコーテーションじゃなくてバッククオートじゃないといけなかった
# 平均
awk '{sum+=$1}END{print sum/NR}' hoge.txt
# 分散
awk '{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print s/(NR-1)}' hoge.txt
# 標準偏差
awk '{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print sqrt(s/(NR-1))}' hoge.txt
awk '{sum+=$1}END{print sum/NR}' hoge.txt
# 分散
awk '{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print s/(NR-1)}' hoge.txt
# 標準偏差
awk '{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print sqrt(s/(NR-1))}' hoge.txt
あとで気づいたけど、これ"あんちべ"さんだ・・・
別の記事に艦これの加賀さんが出て来ていたのでメモメモ
■ 面白い記事 : 自然言語処理の最新手法"word2vec"で艦これ加賀さんから乳を引いてみる
(2017/09/04 追記)
# シャッフルを用いた重複なしランダムサンプリング
awk 'BEGIN{srand()} {line[NR] = $0} END{for(;i<100000;i++){r=1+int(rand()*NR);s=1+int(rand()*NR);tmp=line[r];line[r]=line[s];line[s]=tmp};for(t in line)print line[t]}' hoge.txt | awk "NR <= 100"
awk 'BEGIN{srand()} {line[NR] = $0} END{for(;i<100000;i++){r=1+int(rand()*NR);s=1+int(rand()*NR);tmp=line[r];line[r]=line[s];line[s]=tmp};for(t in line)print line[t]}' hoge.txt | awk "NR <= 100"
これで100000回並べ替えを行って、そこから先頭の100個のデータを抽出できる
元のソースコードは上記と同じリンク
srandは現在の時刻から初期シードを生成して、乱数生成を行うので
1秒以内に同じコードを実行するとまったく同じ結果になってしまう
この処理を何度も行うときはsleep 2とかを間に挟んだ方が良い
プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST
print "先月子供が産まれました!"
# 最終更新 2022/10/25
職業:物理屋
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST
print "先月子供が産まれました!"
# 最終更新 2022/10/25
カテゴリー
ブログ内検索
リンク
相互リンク募集中です
(Twitterにてお知らせください)
Demo scripts for gnuplot version 5 (gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)
gnuplotスクリプトの解説 (米澤進吾さんの個人ページ、gnuplotと言えばこのかた)
gnuplot のページ (Takeno Lab、うちのブログがリンクされていたのでリンク返し)
Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco (映画の感想をまとめられるサイト、いつもお世話になっています)
Astronomy Picture of the Day Archive (天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)
今日のほしぞら (任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)
GNUPLOTとアニメーション (応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)
読書メーター (読んだ本をリストできる便利なサイト)
flickr難民の写真置き場 (20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)
教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定 (阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)
英語論文執筆用の例文検索サービス (とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)
Demo scripts for gnuplot version 5 (gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)
gnuplotスクリプトの解説 (米澤進吾さんの個人ページ、gnuplotと言えばこのかた)
gnuplot のページ (Takeno Lab、うちのブログがリンクされていたのでリンク返し)
Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco (映画の感想をまとめられるサイト、いつもお世話になっています)
Astronomy Picture of the Day Archive (天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)
今日のほしぞら (任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)
GNUPLOTとアニメーション (応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)
読書メーター (読んだ本をリストできる便利なサイト)
flickr難民の写真置き場 (20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)
教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定 (阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)
英語論文執筆用の例文検索サービス (とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)
最新記事
(11/20)
(03/05)
(02/29)
(02/21)
(02/21)
(02/21)
(02/21)
(01/13)
(01/05)
(01/05)