bash」タグアーカイブ

zsh commandline

先週クイックアクションのページを更新したんですけど。
zip 作成にて zsh ではエラーになる件、理由が判明した。

aa="-l -a"
ls $aa

zsh_bash

zsh は一度変数にいれた IFS 区切りをループ展開できないのは有名。
ループだけでなくコマンドでも同様、zsh で実行させる手段は一応ある。
一度全部を文字列化して eval する、完全に二度手間ですね。

eval "ls $aa"

bash ならできてあたりまえのことが zsh だとできない。
何故 Apple はこんなのをデフォルトシェルにしてしまったのやら。
いやまあ筆者は ssh 等を Fedora でしかやらないから別にいいけど。

ぶっちゃけ筆者の Mac には PHP も今は入れていないし。
Fedora と併用するんだからまったく別々に使ったほうがいいやって。
写真関連は Mac と iCloud で、Web 関連は Fedora で。

ということで今日の五条川。

kogamo

四月末に旅立ったコガモ一家が岩倉某所に戻ってきました。
今年は冬鳥が早めですね、先々週までの残暑が嘘みたいに。
ちなみにここより上流では渡りガモを見たことがない。

pdftocairo

PDF ファイルに一つの画像しか入っていないファイルが時々見つかる。
こういうファイルは使い辛いので画像に変換したくなりますよね。

Fedora 等の Linux であれば最初から入っている gs コマンドで変換できる。
以下のスクリプトをパスの通った場所に置いておくと便利みたいな。

#!/bin/sh

# pdf to jpeg
gs -dSAFRE -dBATCH -dNOPAUSE -sDEVICE=jpeg -sOutputFile=${@%.*}.jpg "$@"
# output 300dpi
#gs -dSAFRE -dBATCH -dNOPAUSE -sDEVICE=jpeg -r300 -sOutputFile=${@%.*}.jpg "$@"

これで今まで問題なかったんですけど。

路線・駅情報|電車のご利用案内|名古屋鉄道

ココの PDF ファイルで困ったことに。

gs jpeg

この手段では文字が潰れて読めません、JPEG の弱点がモロに。
300dpi に指定すれば読めるけどファイルが巨大に、一億画素って。。。
ならば PNG にすればいいかなと。

gs -h

を見ると png256 や pngalpha があるなと。
png256 指定だと jpeg 同様に潰れる、てかアンチエイリアスが死ぬ。
pngalpha を指定してみる、嫌な予感がするけど。

#!/bin/sh

gs -dSAFRE -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile=${@%.*}.png "$@"

gs png

やっぱり、PDF の白背景って実は透過なのよ。
印刷用途を考えると利にかなっているけど GUI ではこうなるんです。
自作アプリを PDF に対応させた時ソコに苦労したもん。

じゃあ、ということで Poppler を使って自作してみたんですが。
今度は異様に小さくなってしまった、dpi を得るとかしなきゃ駄目なのか?
上手くいかなかったのでコードは貼らないけど。

なんか他に上手い手段は無いかと色々探す。
いやまて、もしかしたらオイラは凄い遠回りをしているんじゃないか?
思いつきでターミナルにて pdf と打って Tab キーを叩いてみる。

pdftocairo

pdftocairo なんてコマンドがあるんだが。
Poppler の付属品のようなので GNOME なら最初から入っているはず。
help を見てみるとこの用途ズバリみたいな、よし試す。
ppi はデフォルトが 150 だけど 72 で十分かな。

pdftocairo -png -r 72 rosenzu.pdf out

出力名指定は拡張子不要、自動連番で複数ページにも対応みたい。
更に以前書いたスクリプトで WebP に変換すると小さくなって素敵。

to webp

うん完璧だ、今度からこのコマンドを使おう。
指定が単純だから Nautilus スクリプト化やラッパーコマンドも不要ですね。
と Fedora ではここまで調べるのに時間が掛かりましたけれど。

preview.app

macOS なら Preview.app から複製して保存するだけで変換できます。
dpi 指定も GUI で可能とか、やっぱり画像関連では macOS のほうが便利です。

bash 5.1

Fedora 35 の bash は 5.1.8 である。
何を今更だが 5.1 で大文字小文字変換に新たな手段が追加されていた。
U u L 指定らしいんだけど、どう指定すればいいのかはドコにも書いていない。

How to convert a string to lower case in Bash? – Stack Overflow

やっと見つけた、fedorqui さんありがとう。

#!/bin/sh

pen='olympus PEN'

echo ${pen@U}
#=> OLYMPUS PEN

echo ${pen@L}
#=> olympus pen

echo ${pen@u}
#=> Olympus PEN

結局ブレースが必要なのか。
zsh みたく $pen:U とはできなかったのだろうか。
u は先頭文字以外を無視するだけだし使い道が無さそう。

#!/bin/sh

pen='olympus PEN'

echo ${pen^^}
#=> OLYMPUS PEN

echo ${pen,,}
#=> olympus pen

echo ${pen~~}
#=> OLYMPUS pen

今までのとタイプ数が変わっていないし、反転指定は無いし。
いやまあ、こんな手段もありますよってことで。

ということでコレを Tips ページに追記して。
こないだ調べたシェル関連も忘れないうちに追記して。
ついでに GTK4 ページのできているところまでもアップロードして。

よくみたら前の更新は昨年の今日だった、放置しすぎだ!
そんなこんなで、一年ぶりに本サイト更新です。

bash Color 256

前々回、tree コマンドを Python で自作したんだけど。
「ディレクトリを青色にしたけど tree コマンドとなんか色が違う」
の本家 tree コマンドの色を出力したい。

bash:tip_colors_and_formatting – FLOZz’ MISC

こんなページを発見。
bash ってここまで高機能だったのか、マジで知らなかった!
というか \033 だけじゃなく \e とか \x18 でも良かったのか。
アンダーラインも点滅も反転も、256 色で色指定さえも思いのまま。

しかし文句の付けようがない完璧で解りやすいまとめだなぁ。
こんな有用なページを筆者も作りたい、それは別の話で。

とにかく 256 色に指定するには以下にすればいいのね。

echo -e "\e[38;5;numm***string***\e[0m"

色見本ではドレが tree コマンドの青なのかよくわからない。
自前でソレっぽいのをいくつか選んで出力して確かめてみよう。

#!/bin/bash

for cl in {31..33} {37..39} {73..75} ; do
	echo -e "\e[38;5;${cl}m_texts\e[0m"
done

sh_color

どうやら 33 で正解のようだ。

ところで下方に対応ターミナルの表がありますが。
macOS の Terminal.app でも printf にすればイケます。
おまけに指定は sh でも bash でも zsh でもオケ。

mac_sh

CRLF

何を今頃だけど JavaScript の replace について。

String.prototype.replace() – JavaScript | MDN

第一引数を正規表現にすればすべてのマッチした箇所を置換できるのか。
最初に一致した箇所だけだとずっと勘違いしていた筆者であった。

JXA: doShellScript Line feed code | Paepoi Blog

これを試しに書き換えしてみよう。

#!/usr/bin/osascript

let app = Application.currentApplication();
app.includeStandardAdditions = true;

res = app.doShellScript('ls -l');
console.log(res.replace(/\r/g, '\n'));

いけた。

ついでに。
よく考えたらコマンドの中で tr を使って変換すりゃいいじゃん。
と思ってやってみたら上手くいかなかった。

#!/usr/bin/osascript

let app = Application.currentApplication();
app.includeStandardAdditions = true;

// no...
//res = app.doShellScript('ls -l | tr "\r" "\n"');

// test
res = app.doShellScript('ls -l | tr "\n" "|"');
console.log(res);

となる。

つまりコマンド実行の時点では改行コードは LF のまま。
doShellScript が値を戻す時に CR へ変換しているようです。
LF のまま戻すオプションって無いのかな?

lf

#!/usr/bin/osascript

let app = Application.currentApplication();
app.includeStandardAdditions = true;

res = app.doShellScript('ls -l', {alteringLineEndings:false});
console.log(res);

あった、今後はコレで。

ついでに、doShellScript は bash の POSIX 互換モードです。
zsh やフル状態の bash ではないので注意、macOS って本当に色々面倒臭い。
プログラミングするならやっぱり Linux だよ、某サル専用を除く。

関係ないけど Macbook Air 2020 が出たね、かなり良さげ。
でも筆者はこんな使い方ばかりだから 2018 モデルで何の不満も無いのよね。
ペチペチキーボードにもすっかり慣れてしまったし、うるさいけど。
さて 10.15.4 にアップデートするか。