zsh」タグアーカイブ

zsh Expansion

凝りもせず macOS で zsh を色々試しているんだけど。
zsh: 14 Expansion
一部を抜き出すと。

#!/bin/zsh

arr='IFS 区切りのまま for'
for s in ${=arr}; do
    echo $s
done

val='カンマ,区切りを,ループ'
for j in ${(ps.,.)val}; do
    echo $j
done

aa=(配列を 改行 区切りに合体)
echo ${(F)aa}

えっと。
理解できたのは Python 屋が使うモンじゃないってことだった。
だって覚えたところで永久に使わなさそうだもん、こんな書き方。
覚書ページへの追記は基本的なものだけにしておこう。

Atom zsh

おいおい、Atom の Script パッケージって…

zsh は日本語を一文字扱いしないのかと一瞬思ってしまったジャン。
パッケージが日本語を正しく扱えないということみたいね。

Python – 日本語が出力されない(atom、python)|teratail

あれ?
筆者は Python で文字化けしたことなんて無いんだけーが。
Python3 しか使わないからなのかな、まあいいや。

ようするにこのパッケージは初期化設定を読み込まないってことみたい。
Shell なのでとりあえず init.coffee に以下を追記し再起動。

process.env.LANG = 'ja_JP.UTF-8';

なんだコレだけだった。
キチンと zsh で起動しているね、よかったこれで使える。

# 追記
上記をやると spell-check パッケージがエラーを吐く。
日本語環境では無意味なものだし無効にとこうね。

Catalina Scripts

zsh でプロンプトのカスタムは以前書いたのだけど。
zsh | PaePoi

~/.zshenv ではなく ~/.zshrc に書く必要があるみたい。
~/.zshenv では Mojave には無かった /etc/zshrc に上書きされてしまう。

PROMPT でもいいみたいだけど PS1 変数も使えるみたい。
RPROMPT も問題ないけど筆者は Fedora と共通にしたいので以下のようにした。
ブラケットが無いとコマンドの始まりがドコなのかワカンネーもん。

# ~/.zshrc @ User specific environment

PATH="$HOME/.local/bin:$HOME/bin:$PATH"
export PATH

# Fedora like Prompt for bash
#PS1='[\u@\h \W]\$ '
# zsh
PS1="[%n@%m %1~]%# "
#RPROMPT="[%~]"

# alias
alias ll="ls -l"
alias jxa="osascript -i -l JavaScript"
alias jsc=/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc

atom は .zshrc 等を色分けしてくれる、素敵!
スクショ間違っていたので 20 時修正。

それと。
前回クイックアクションで 72dpi 変換ができなかった理由が判明。
iPhone でお馴染み、サンドボックス機能のアクセス許可で弾かれているようだ。

Automator から「指定されたFinder項目を取得」にデスクトップの画像を一旦入れ実行。
アラートが出るので [OK] をクリック、これで Automator からはアクセス可能になる。
しかしそれをやっても「クイックアクション」からはアクセスできない、失敗作だろコレ。

クイックアクションは死にました、チーン♪
いや修正は入る、かな…

これじゃ不便なので拡張のほうに変換スクリプトを作り替え。
macOS アプリを JXA (AppleScript) で拡張

#!/usr/bin/osascript

// change72dpi.js

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

let selections = Application('Finder').selection();
for (let item of selections) {
    if (item.nameExtension() === 'png') {
        let fullPath = decodeURI(item.url()).slice(7);
        let pos = fullPath.lastIndexOf('/');
        let path = fullPath.substr(0, pos);
        let name = item.name();
        app.doShellScript(`cd '${path}'
        src_width=$(sips -g pixelWidth '${name}' | cut -s -d ':' -f 2 | cut -c 2-)
        width=$(($src_width / 2))
        sips -s dpiHeight 72.0 -s dpiWidth 72.0 -Z $width '${name}' --out '72dpi-${name}'`);
	}
};

デスクトップのスクリーンショットを選択し実行。
アクセス許可アラートで [OK] を選択すると下記に表示されるようになる。

許可ばかりでサンドボックスの意味ネェ。
そもそもこんな Mac の使い方をする人は少ないだろうけど。
とりあえず当面はこの方法で 72dpi 変換するとしよう。

zsh も bash と同じく $((formula)) 計算できるのね。
てかバッククォートを JXA で使うのでシェル部分で使えないのは難しかった。
NSRect が使えればもっと簡単な手段があるのになぁ。

ところで Python3 なんだが。

macOS 10.15 Catalina 19A583にはPython 2.7.16、Ruby 2.6.3p62、Perl 5.18.4が同梱されるも、Python 2.7の使用は非推奨で”python3″を推奨。 | AAPL Ch.

元々インストールしていたマシンならそのまま使える、ってことか。
ただ筆者は 3.7.4 に更新していたのに 3.7.3 に巻き戻されてしまった。
多分今後も勝手にそうされるだろうからこのままにするけどさ。

今日はここまで。

(bash|zsh) array and for

zsh の for は何か bash と違うと思ったら
どうやら zsh では isf 区切りではなく配列を使うようだ。
先に配列について調べておく必要があるな。

zsh の配列操作の基本から応用まで – Qiita

配列は [1] から始まるんかい。
lua なんかもそうだけど何故ゼロにしなかったのか。
bash と整合性が、、、、、
って bash では isf 区切りが基本すぎて誰も使っていないと思うけーが。

シェルスクリプトの文字列と配列 – L’Isola di Niente

コイツを zsh 向けに書き換えしてみよう。

#!/bin/zsh

# 配列の作成、括弧で囲む
array=(先頭 次の項目 最後)

# echo してみる、インデックス指定無しだと先頭が出力される
echo $array
#=> 先頭

# インデックスは C 言語と同様
# bash と違って中括弧不要
# 先頭は 1 で最後は -1
#echo ${array[1]}
echo $array[2]
#=> 次の項目

# += で追加できる
# bash と違い括弧で囲む必要はない
#array+=(追加)
array+=追加
# 全てを出力する時は @ を指定
echo $array[@]
#=> 先頭 次の項目 最後 追加

# インデックスを使って追加や書き換えできる
# bash と同じだけどインデックスに注意
array[3]=三番目
echo $array[@]
#=> 先頭 次の項目 三番目 追加

# 範囲は関係ない、インデックスは並び順ではなく番号
array[10]=九番目
echo $array[10]
#=> 九番目

# 単なる未定義になる
echo 百番目は $array[100] です
#=> 百番目は です

# ポインタではない
array[-2]=$array[1]
array[1]=最初
echo $array[-2]
#=> 先頭

# bash で全てを出力する時は @ を指定
# for item in "${array[@]}"; do
for item in $array; do
    echo "item: $item"
done
# bash と同じヒアドキュメントで無理やり複数業コメントが可能
# atom, vscode 等は色分けしてくれる
: << __OUTPUT__
item: 最初
item: 次の項目
item: 三番目
item: 追加
item: 先頭
item: 九番目
__OUTPUT__

# こんな初期化もでき...なかった
#new_array=([1]=456 [2]=789 [0]=123)
#echo $new_array[@]
#=> error

なるほど、bash よりは簡単に使えるようにっているんだね。
Python 等が解る人ならインデックスにさえ注意すれば普通に扱える。
もっと機能はあるけど push(append) と for を覚えれば大抵困らない。
で、for はやはり配列を回すということみたい。

#!/bin/zsh

# 以下は共通です
# *.sh 等のワイルドカードも使えます
for f in これは 共通 です; do
    echo $f
done

# 変数に入れる場合 zsh は配列にする
# ワイルドカードなら arr=(*.sh), isf=*.sh
# てか zsh は arr=*.sh としてもワイルドカードを展開しない
if [[ $ZSH_EVAL_CONTEXT = toplevel ]]; then
    arr=(zshは 配列に します)
    for s in $arr; do
        echo $s
    done
    # 省略構文、変数が配列でも括弧が必要
    #for a ($arr) echo $a
else
    isf='bashはご存知 isf 区切りです'
    for s in $isf; do
        echo $s
    done
fi

# zsh の省略文
# do done の代わりにブレースを使うこともできる

# ブレース展開の結果が異なる
echo {02..10}
# bash: 2 3 4 5 6 7 8 9 10
# zsh:  02 03 04 05 06 07 08 09 10

ワイルドカード展開も配列になるのかなと思ったけど違うようだ。
bash と違ってイコール直後のアスタリスクは只の文字列扱いになるし。
in 直後の isf 区切りのみ特別扱いってことなのかな?
実際それで実用上は問題は無い気もする。

zshのfor文は強かった – Qiita

すごく機能は豊富だけど覚える必要があるかどうかは微妙。

それより発見、ブレース展開が小細工せずにゼロ詰めできる!
これだけのために Fedora にも zsh を入れようかと思うくらい便利。
って、ここ何のブログだっけ?

(bash|zsh) read command 2

read コマンドをもう少し。
ファイルの読み込みなんかは bash と同じみたい。

bash: ‘\n’ in read file (part2) | PaePoi

while read -r line; do
    echo $line
done << __DOC__
aaa bbb
ccc\nddd
eee
__DOC__

うん、sh と同じく \n 文字は改行扱いになるってか。
それより、ついでと思い bash 直指定したら文字列扱いになってしまったんだけど。
Fedora では sh は単なる bash へのシンボリックリンクなんだけど。

macOS の sh は別コマンドなのか、でも [[ とかの bash 拡張は使えるし。
正直よくわからんぞ。
シバンは明確に #!/bin/bash とかを利用したほうが良さげ。