それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bash で三項演算子っぽく処理を書くには

bash でも三項演算子を使いたい

かんたんな、初期値nullチェックとかで三項演算子的なことをよくやります。

bash でもやりたいなと思って調べててみたけど、なかった(あったので追記書きます。)。

条件分岐を使って原始的な手法がsh/bash で使えるのでご紹介。

三項演算子の変わりの原始的手法

[[  $var == abc ]] && echo OK || echo NG

サンプル

#!/bin/bash

## 変数
a=1

echo TRUE になる場合
[[ $a == 1 ]] && echo TRUE || echo FALSE

echo FALSE が実行される場合
[[ $a == 0 ]] && echo TRUE || echo FALSE

三項演算子bash に存在しない

将来のアップデートでbash には搭載されるかもしれないけど、sh には永遠に搭載されないだろし

条件判定を組み合わせて三項演算子っぽく記述できる方法は便利だし採用していきたい。

三項演算子の書き方(追記

三項演算子はsh にはなくbash 独自の機能 (( ))を使えば、書くことが出来ました。

a=1
b=$(( a !=0 ? -1 : 0  ))

ちなみに、(( ))のArithmetic expressions を書くときは、変数に$を付けない。

実際に動かしてみた例はこちら。

takuya@~$ unset a b
takuya@~$ a=1
takuya@~$ b=$(( a !=0 ? -1 : 0  ))
takuya@~$ echo $b
-1
takuya@~$
takuya@~$ unset a b
takuya@~$ a=0
takuya@~$ b=$(( a !=0 ? -1 : 0  ))
takuya@~$ echo $b
0

2019-08-29 訂正

三項演算子ありました。 (( )) を使えば、C言語スタイルの演算ができるので、もしやと思って調べたら・・・

参考資料

https://wiki.bash-hackers.org/syntax/arith_expr

systemdのジョブの起動前、起動後に処理を記述する preExec / PostExec

systemd で自動起動するファイルを記述したが pip のアップデートで苦労する

systemd でdaemon を起動しているのですが、pip 関連でアップデートが頻繁にあるモジュールだと、前もって更新してあげないとエラーになることがる。

systemd で事前処理・事後処理を書けないか調べてみたらあった

ExecStartPre を使うと、起動前に実行してくれるようだ。

ExecStartPre=, ExecStartPost= Additional commands that are executed before or after the command in ExecStart=, respectively. Syntax is the same as for ExecStart=, except that multiple command lines are allowed and the commands are executed one after the other, serially.

複数行の処理は?

ExecStartPreを複数書けばいいらしい

書いてみた。

pipenv に入れた pip や requirements.txt をDaemonの起動前に、更新をするように書きました。

[Unit]
Description=Splattoon splatnet2ink

[Service]
WorkingDirectory=/PATH/TO/project
ExecStartPre=/PATH/bin/python /PATH/TO/pipenv/bin/pip install --upgrade pip 
ExecStartPre=/PATH/TO/pipenv/bin/python /PATH/TO/pipenv/bin/pip install --upgrade -r  requirements.txt
ExecStart=/PATH/TO/pipenv//bin/python /PATH/TO/pipenv/daemon.py -M

[Install]
WantedBy=default.target

これで更新処理を別途書く必要がなくなる。

これまでは、ライブラリ更新処理を、別途 timer にしてたり、更新後再起動をタイマーにしてたのですが、不便でした。

これで、PCを起動時、ユーザー systemd 空間なら、ログイン時に更新されるはず。だから timer 関連のsystemd ファイルが減って管理が楽になりそうです。

参考資料

https://www.freedesktop.org/software/systemd/man/systemd.service.html

ついに牙を向いたPublic DNS

Cloudflare の 1.1.1.1 が dns 応答を拒否し始める。

巨大になった組織の宿命というか、世間のレベルより「踏み込んだ」対応をして自粛をしないとダメなんだろうけど、管理は、インターネットな文化と相容れないと思ってた私の脳みそは時代遅れで腐っているのでしょうかと。

www.itmedia.co.jp

DoH も危ない

DNS over HTTPSFirefox のも Cloudflare が請負っているので、あちらも同じことになると思う。

自前で dns が必要

public dns が使えないなら、昔のように、自前で public dns を建てるしか無い。

unbound をインストールするしか。

しかし、自宅ならともかく、4G/5Gのモバイルネットワークでどうするんだよこれ。 DNSを支配される悪夢だ・・・