Software Design7月号未掲載部分

Pocket
LINEで送る

本日発売です。bashのマニアック機能について「使うなよ!絶対使うなよ!!」というテイストで書きました。

で、宣伝部分だと味気ないので、調子に乗って書きすぎて掲載できなかった部分をあまり加工せずに貼り付けておきまっす。bash3.2とbash4.4で挙動の違う例、4.0以降の新機能の例です。

数字のブレース展開のゼロ埋め

ブレース展開においてゼロ埋めができるようになっています。

bash-3.2$ echo {01..03}
1 2 3
bash-4.4$ echo {01..03}
01 02 03

Unicodeのコードポイント指定

Unicodeのコードポイントを指定して文字を出力できます。

###UnicodeとUTF-8の16進数を指定してみる例###
bash-3.2$ echo -e '\U1F363' '\xF0\x9F\x8D\xA3'
\U1F363 🍣
bash-4.4$ echo -e '\U1F363' '\xF0\x9F\x8D\xA3'
🍣 🍣

次の例は、
この機能とxxdというコマンドを使ってUnicodeから
UTF-8へ変換するワンライナーです。

bash-4.4$ echo -en '\U1F363' | xxd -ps
f09f8da3

case文で使う「;;&」

次のcase文は、SHELLという変数の文字列がbashで終わっている場合に
「bash」と表示するものです。「\*bash」というパターンにマッチして
echoを実行し、次の「\*」は評価されずに終わっています。

bash-3.2$ case $SHELL in *bash ) echo bash ;; * ) echo defalut ;; esac
bash

バージョン4.0ではこの挙動に加え、
「;;&」を用いて次のパターンも評価させることが可能となりました。

bash-4.4$ case $SHELL in *bash ) echo bash ;; * ) echo defalut ;; esac
bash
bash-4.4$ case $SHELL in *bash ) echo bash ;;& * ) echo defalut ;; esac
bash
defalut

大文字を小文字に強制変更する変数

declare -lで変数を宣言すると、代入した大文字が小文字に変換されます。

bash-4.4$ declare -l yesno
bash-4.4$ yesno=YeS
bash-4.4$ echo $yesno
yes                   #小文字になる

また、例は省略しますが、declare -uで宣言すると大文字に変換されます。

普通の変数に対して後から小文字大文字を変換することもできます。
変数の後ろに「^」や「,」をつけます。

bash-4.4$ y=YeS
bash-4.4$ echo ${y^^} #大文字に
YES
bash-4.4$ echo ${y,,} #小文字に
yes
bash-4.4$ echo ${y,}  #1文字目だけ小文字に
yeS

ということで

買って読んでいただければ幸いです。

こちらもお願いしまっす!

Pocket
LINEで送る

Ubuntu 14.04 server用のROS一撃インストールシェルスクリプト

Pocket
LINEで送る

こういうものは世にたくさんあると思いますが、サーバ版のものはないかもしれません。ちゃんとケアします。

ryuichiueda/ros_setup_scripts_Ubuntu14.04_server

Pocket
LINEで送る

bashのpipefailで確実にスクリプトを止める

Pocket
LINEで送る

シェルプログラミング実用テクニック、出版される前からもう補足ですが、私めがbashのpipefailというオプションをすっかり見落としていたのでフォローしておきます。

本文ではbashに-e(エラーがあったら止める)をつけてもパイプラインの左側のコマンドにエラーがあったときに処理が止まらないと書きました。

例です。

続きを読む bashのpipefailで確実にスクリプトを止める

Pocket
LINEで送る

個人的現在の状況(ところでshellshockってshに失礼ではないか?)

Pocket
LINEで送る

生きてます!

ということで、現在こんな感じです。

  • bash製で表に出ているものは止めている。bashで環境変数に関数を仕込めるというのはバグではなくそういう実装だったということで、現在議論が続いているようなのでそれ待ち。
  • 早いうちにbashcmsのdash版(dashcms。笑)を作るすぐ作りました!)。bashに完全に依存してるのはPIPESTATUSの部分だけなので、時間を見つけて落ち着いてやれば一時間くらいでできるかなーというところ。時間を作る。

私が本当に欲しいものはコマンドやプロセス、ファイルを制御できるものなので、そういう意味ではbashにこだわる必要はないんですが、それでも便利なのとbashbash言って本まで出している手前ちゃんと良いところ悪いところを説明しないといかんなと考えております。

あとまあ、shの実体がbashのアレはもう少し様子見になるかと。

Pocket
LINEで送る

先程から騒ぎになっているbashの脆弱性について

Pocket
LINEで送る

確認しました(苦笑)

(追記: envを抜いてましたが、それだとCシェル系で確認できないので加えました)

ueda@remote:~$ env x='() { :;}; echo vulnerable' bash -c 'echo this is a test'
vulnerable
this is a test

続きを読む 先程から騒ぎになっているbashの脆弱性について

Pocket
LINEで送る

bashで中括弧のグループコマンドをパイプでつなぐとサブシェルで実行されるので一応気をつける

Pocket
LINEで送る

どうも。寝不足太郎上田です。細かい話が嫌いなのですが、調べる必要があり、調べたことを書きます。

{}で囲ったグループコマンドについてはシェルスクリプト本体と同じプロセスで動作するという記述がmanにあります。

ueda@remote:~$ man bash
...
       { list; }
              list is simply executed in the current shell environment.  
...

続きを読む bashで中括弧のグループコマンドをパイプでつなぐとサブシェルで実行されるので一応気をつける

Pocket
LINEで送る

bashで作ったTwitter投稿クライアントのコードをお掃除

Pocket
LINEで送る

とある事情があって整理して、ようやくちゃんとしたものができました。プロトコルとかエンコードとかをちゃんと押さえればライブラリに頼る必要はないんだよという例になっているかと。・・・別に頼ってもいいですが。

※追記:ACCESSTOKEN_SECRETは間違いです。ACCESS_TOKEN_SECRET で。最新のものは修正されています。

https://github.com/ryuichiueda/TomoTool/blob/222180b0913da4f5d77217e8eae530e74a46abc7/Twitter/usptomo-tweet

Pocket
LINEで送る

シェルの&&||パズル(解答編)

Pocket
LINEで送る

この前、ここで、次の四つのコマンド列の出力を当てるクイズを無責任に出題しましたが、ちゃんと真面目に解答します。

$ false && true || true && echo OK          <- 1
$ true && true || false || echo OK            <- 2
$ true || true || true && echo OK             <- 3
$ false && true || false || echo OK           <- 4

考え方

シェルも一応言語ですが、基本、コマンドを起動するための道具なので、上から下、左から右に順にコマンドを起動していきます。それで、「&&」も「||」も、左のコマンドの終了ステータスによって、右のコマンドを起動するかどうか決めるものですので、右側のコマンドが起動されるかどうかをまず考えます。例えば1の問題だと、最初の二つのコマンドは、falseが起動されてtrueが起動されません。

$ false (<-起動される) && true (<- 起動されない) || true && echo OK 

次に考えなければいけないのは、&&や||が見ている終了ステータスは、最後に起動したコマンドの終了ステータスだということです。ですから、1の問題では、次のように解釈できます。ですので、|| true のtrueは実行され、その次のecho も実行されます。

$ false (<-起動される) && true (<- 起動されない) || (<- falseの終了ステータス) true && echo OK 

これをおさえて左から右に慎重に考えて行けば、答えは特定できるかと思います。

$ false && true || true && echo OK
OK
$ true && true || false || echo OK
$ true || true || true && echo OK
OK
$ false && true || false || echo OK
OK

いかがだったでしょうか。しかし、可読性に重大な問題が発生するので、ぜひ使わないようにしていただきたく。

おしまい。

Pocket
LINEで送る

シェルの&&||パズル

Pocket
LINEで送る

問題です。シェル(bashを使用)で次のコマンド列をたたいたとき、「OK」と出るのはどれとどれでしょうか?

解説は後日。

$ false && true || true && echo OK          <- 1
$ true && true || false || echo OK            <- 2
$ true || true || true && echo OK             <- 3
$ false && true || false || echo OK           <- 4

Pocket
LINEで送る