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 文も微妙に違う。
細かいことはもう少し調べてから。

run shebang @ Visual Studio Code

本サイトのアクセス状況がなんか変。
ログのユーザーエージェントを見ると WWWC が、コイツが原因か。
Windows のネタなんてとうの昔に全削除しているのに意味不明、何故?

よし、今月は macOS のネタしかやらないことにする。
来月は Fedora 30 が出るはずだし、ということで。

とりあえず今朝までに blog でやったクイックアクション等はまとめた。
macOS Tips – L’Isola di Niente

次は VSCode を Gedit 化するページを作っているんだけーが。
実はまだ shebang 実行を実現していなかったりする。
Gedit でスクリプトを debug – L’Isola di Niente

tasks.json は Python3 では “command”: “python3” にしているだけ。
Visual Studio Code 2018 | PaePoi

シバンを見つけて実行する手段が無いのなら自分で作ればいいジャン!
head コマンドからシバン部分を抜き出すスクリプトを書いてしまえ。

#!/bin/sh

line=`head -n 1 $1`
${line#*!} $1

たった 2 行。。。

これに run_shebang と拡張子の無い名前を付けて保存。
実行パーミッションを付けパスの通った所に置く、tasks.json の書き換え。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "run shebang",
            "type": "shell",
            "command": "run_shebang",
            "args": [
                "${file}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always",
                "panel": "new"
            }
        }
    ]
}

command に run_shebang を指定。
タスクの実行をやってみる。

よしイケる、もっと早くこの方法に気が付けばよかった。
拡張又はフリーソフトをインストールwwwww
って、たった 2 行のスクリプトすら自分で書けない人のやることだ。

Shell: Get Distribution Name

Linuxのバージョンの確認方法 – Qiita
Linux OSの種類とバージョンの調べ方 – Qiita

あれ? /etc/os-release ならばどのディストリビューションにもあるのか。
ということはドットコマンドで取り込んで。

#!/bin/sh

# ディストリビューション名
. /etc/os-release; echo $PRETTY_NAME
#cat /etc/system-release では Fedora 等一部

$NAME なら簡易。

これでどのディストリビューションでもイケるはず。
でもドットコマンドってどのシェルでも使えるかどうかは知らない。
ダメだったら source に書き換えしてちょ。
ちなみに macOS には /etc/os-release は無いです。

覚書ページの作り替え作業が終わらないので小ネタでした。

macOS Zip compress without ‘__MACOSX’

前回の続き。
よく考えたら zip コマンドなら __MACOSX は作られないんだよね。
だったらクイックアクションを作ってしまえばイイじゃん。

せっかくなのでプロンプトを出して圧縮名を決められるようにする。
デフォルトはディレクトリ名で、Fedora の file-roller と同じように。

Automator 起動、クイックアクションを新規作成。
[指定された Finder 項目を取得] を配置
[シェルスクリプトを実行] を配置

dpath=`dirname $1`
cd $dpath
dname=`basename $dpath`

res=`osascript -e "set result to display dialog \"Archive Name ?\" default answer \"$dname\"
text returned of result"`

for f in "$@"; do
	s=`basename $f`
	param+=" $s"
done

zip -r $res.zip $param

保存、日本語でもいいよ。

注意点はパラメーターはフルパスだということ。
$@ で zip に渡すと展開時にパスを再現してしまいます。
dirname, basename コマンドをフル活用しよう。

Finder で何か選択して実行、よし __MACOSX の無い zip のできあがり。
二本指タップから ZIP 圧縮するんだから同じだよね。
ただ、Automator のエディタはなんとかならんのか、編集し辛すぎ。