bash」タグアーカイブ

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 のエディタはなんとかならんのか、編集し辛すぎ。

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

前回の抜き出しシェルスクリプトだけど。
echo -e で出力しようとしたのがいけなかったようだ。

while ループの中でガシガシとリダイレクトすればイケそう。
と思って Fedora で試すとバッチリ狙いどおりに出力された。

mac にソースを持って行くと、あれ?
なんかおかしいけど原因が解らない、仕事中も含め半日悩む。
下記の実験コードでやっと理解。

#!/bin/sh

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

Fedora

macOS

macOS の read は改行コードと文字列の \n を区別してくれない。
のではないな、echo で改行されてしまっているようだ。
echo “aa\nbb” だと普通に \n が出力されるのに、よくわからない。

後、前回は気が付かなかったけど macOS の echo には -e オプションが無い!
bash のバージョンが違うのは知っているけどまさかこんな所が違うとは。

同じ bash だから同じ挙動やオプションだと思ってはいけない教訓になった。
拡張の [[ とかは同様に使えるのにね。
てか、macOS って中身は本当に色々と古いんだよなぁ。

bash: ‘\n’ in read file

py2app で分割で作っている Python ファイルを扱う手段がわからない。
ならば合体スクリプトを作って単体にしてしまえばいいんでね?

目印に #begin, #end みたいなのを書いてその中間だけを取り出せば簡単そう。
ということで早速シェルスクリプトを書いてみた。

##!/bin/sh

ifs=$IFS
IFS=$'\n'

for filename in *.py; do
    while read -r line; do
        [[ $line =~ "#end" ]] && break
        [[ $begin = begin ]] && lines+="$line\n"
        [[ $line =~ "#begin" ]] && begin=begin
    done < $filename
    begin=""
done

echo -e $lines

IFS=$ifs

のですけど。。。

#!/usr/bin/env python3

#begin

class TestClass():
    def __init__(self):
        print('hello\nworld')

#end
TestClass()

こんなファイルで試すと。

class TestClass():
    def __init__(self):
        print('hello
world')

えぇ。。。

ソースコード中の \n まで改行とみなされてしまうのカヨ!
ちなみに -r 無しだと hellonworld になるのでもっと注意。
cat ならイケるかな。

##!/bin/sh

ifs=$IFS
IFS=$'\n'

for filename in *.py; do
    for line in `cat $filename`; do
        [[ $line =~ "#end" ]] && break
        [[ $begin = begin ]] && lines+="$line\n"
        [[ $line =~ "#begin" ]] && begin=begin
    done
    begin=""
done

echo -e $lines

IFS=$ifs

同じだ。。。

#!/usr/bin/env python3

import os

lines = []
begin = ''

for filename in [s for s in os.listdir() if s.endswith('.py')]:
    with open(filename) as f:
        for s in f.read().split('\n'):
            if '#end' in s: break;
            elif begin == 'begin': lines.append(s)
            elif '#begin' in s: begin = 'begin'
    begin = ''

print('\n'.join(lines))

python 等なら問題ない。

connect.py みたいなファイルを用意してシェルから呼ぶことにするか。
シェルってほんとに色々と困ったちゃん。

sips

Retina Display の mac でスクリーンショットする。
mac で見る分にはいいけど Blog にアップするとデカくてビビる。
前回のスクショの詳細を見ると 144dpi もある、通常の二倍だ。

全画面だと 2880x1800px になるからたしかに二倍だね。
色々検索するとみんな困っているようで、何故こうしたのやら。

macos – How can I stop my retina display from taking 2x sized screenshots? – Ask Different

sips という素敵なコマンドがあるようだ。
man を見ると BSD がとか出るけど最後に Darwin の文字が。
Fedora の dnf list にも出ないしやはり macOS 専用のようです。

早速クイックアクションに登録。
コピペだと上書きになるので別名保存処理を入れてみた。
コマンドではないからディレクトリ名を得る必要があるな。

for f in "$@"
do
    width=$((`sips -g pixelWidth "$f" | cut -s -d ':' -f 2 | cut -c 2-` / 2))
    dir=${f%/*}
    name=`date "+72dpi-%Y%m%d-%H:%M.%S.png"`
    sips -s dpiHeight 72.0 -s dpiWidth 72.0 -Z $width "$f" --out "$dir/$name"
done

name はお好みに。

値は正常になるけどなんかボケるなぁ。
でもこんなもんでいいだろう、今回よりコレ使います。