zsh」タグアーカイブ

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 とかを利用したほうが良さげ。

(bash|zsh) read command

zsh と bash の read コマンドは全然違うようだ。
bash, zshでyes/no判定をするワンライナー – Qiita

公式のビルトインコマンド man ページも見つけた。
zsh: 17 Shell Builtin Commands

早速試そうと思ったけど bash とソースを分けるのは色々と不便だ。
zsh にしても $SHELL は bash のままだし、readonly に何か無いかな?

あった、$ZSH_EVAL_CONTEXT が定義されているかで判別できそう。
プロンプトとライン入出力と Y|N 判定をひとまとめに書いてみた。

#!/bin/zsh

echo 'May I ask your name?'

if [[ $ZSH_EVAL_CONTEXT = toplevel ]]; then
    read name\?'> '
    echo "Hello $name san"
    printf 'Do you like zsh? (y|N): '
    read -q && echo '\nGreat!' || echo '\noh my god...'
else
    read -p '> ' name
    echo "Hello $name san!"
    read -n1 -p 'Do you like bash? (y|N): ' res
    [[ $res = [Yy] ]] && printf '\nGreat!\n' || printf '\noh my god...\n'
fi

マジで全然ちげえ、この手段でまとめページを作るのは無理があるみたい。
zsh の read -q でプロンプトは出せないのかな?

おまけで、zsh の echo はエスケープシーケンスが使えると解った。
macOS の bash は echo -e すら使えないのに。
組み込みコマンドは大体別物と思ったほうが良さげ。

Atom の script は bash|zsh のシバンも見分けしてくれる、助かる。
入力はできないけど、まあそれは Gedit も同じだ。

zsh

Catalinaでデフォルトシェルが「zsh」に変わる、bashとの違いは? – 新・OS X ハッキング!(241) | マイナビニュース

Catalina 以降は Python2 等がデフォルトで入らなくなるらしいのが話題だ。
筆者はコッチのほうが重要だ、だって bash の Tips ページを作っているんだもん。
今から少し慣れておいたほうが良さそうと思い早速使ってみる。

zsh に変更するとタイトルバーの表示も zsh に変わるのね。
しかしなんだこのシンプルすぎるプロンプトは。
いや bash のプロンプトは Fedora と同じ表示になるカスタムなんだけーがさ。
早々にカスタムだ。

zsh 設定 – プロンプト –

RPROMPT って何だ?
よく解らないことは自分で試してみるのが一番早い。
~/.zshenv を作って以下を書き込み。

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

右に出るんかい!
長いコマンドで上に被さると自動で消える、なるほどって感じ。
今となっては bash にも tcsh にも実装って書いてあるけど。。。
関数から自力で実装する方法しか見付からないんですけど。

一般ユーザーが # ってのも気になる所だけど。
そもそも sudo しか使えないんだからココを変える意味は今では無いんだけーが。
右出しを含めてどちらのシェルか解りやすいしコレでいくかなと。

ところで macOS の bash は cd doc から tab キーで documents になった。
zsh では cd Doc と大文字小文字を合わせないと tab キー補完ができないようだ。

シェルスクリプトの覚書色々 – L’Isola di Niente

read コマンドが微妙に違う。
for 文も微妙に違う。
細かいことはもう少し調べてから。