bash」タグアーカイブ

Here Document

ヒアドキュメントが便利なのでもう少し調べる。
Y901x のインストールスクリプトで使っているから経験はあるのだが。

ヒアドキュメント – Wikipedia

シェルスクリプトはバッククォーテーションでコマンドも使えるのか。

#!/bin/sh

func() {
    echo バッククオートで関数も使える
}
shstr=シェルスクリプト
hdstr=ヒアドキュメント

cat << __EOS__
${shstr}で$hdstrは今更だけど
最初の改行は無視される、最後は echo や cat が改行する
エスケープ文字 \\ は有効
記号は\$とバッククオートを除いて <'"{[+=~ と普通に使える
`func`
__EOS__

自作関数でもいいようだ。

# output
シェルスクリプトでヒアドキュメントは今更だけど
最初の改行は無視される、最後は echo や cat が改行する
エスケープ文字 \ は有効
記号は$とバッククオートを除いて <'"{[+=~ と普通に使える
バッククオートで関数も使える

これはもしかして PHP でも関数が使えるかも。

<?php

function func() { return "関数"; }
$plstr = "Perl";
$shstr = "シェルスクリプト";

echo <<< __EOS__
PHP は${shstr}や $plstr 同様に利用できる
最初と最後の改行は無視されるので最後は一行開けるとよし
エスケープ文字 \\ は有効
記号は\$を除いて <'"{[+=~` と普通に使える
`func` って PHP にこんな機能はもともと無いよ!

__EOS__;
/* output
PHP はシェルスクリプトや Perl 同様に利用できる
最初と最後の改行は無視されるので最後は一行開けるとよし
エスケープ文字 \ は有効
記号は$を除いて <'"{[+=~` と普通に使える
`func` って PHP にこんな機能はもともと無いよ!
*/
?>

んなわけないか。
ところで PHP のヒアドキュメントは最後を改行しなくて最初戸惑った。
よく考えたら echo, cat, print() が改行していただけだった。
PHP の echo は改行しないもんね。

Perl や Lua って Fedora に最初から入っているけど使ったことが無いな。
余程のことがないかぎり今後も使うことは無いと思うけど。
GNOME は以前 JavaScript を押していたけど今はどうなんだろう?

// Gjs
// imports /usr/share/gjs-1.0/format.js

const Format = imports.format;

String.prototype.format = Format.format;

let jstr = "\
JavaScript はエスケープで強引な改行しか手段が無い\n\
更に%s機能は無い\n\
しかし %s ならこんなことができる\n\
%%s, %%d, %%x, %%f のみ";

print(jstr.format("文字列フォーマット", "Gjs"));
/*
JavaScript はエスケープで強引な改行しか手段が無い
更に文字列フォーマット機能は無い
しかし Gjs ならこんなことができる
%s, %d, %x, %f のみ
*/

これだものな。
面倒臭くなってブン投げたのは筆者だけではないと思う。

#include <stdio.h>

#define CSTR "\
%s は\n\
説明不要だよね\n"

int
main (int argc, char ** argv) {
	printf (CSTR, "C 言語");
	return 0;
}
/*
C 言語 は
説明不要だよね
*/

C のほうが簡単なんて洒落にもならん。
プラス記号で成形するのって最初は分かり易いのでいいと思うが。

#!/usr/bin/env python3

DOCSTR = """{0} はお馴染 {1}
最初と最後の改行も有効だけど print が最後を改行する
{2}
{1} は \\ エスケープが有効"""

def func():
    return "関数は format で実行すれば文字列さ"

print(DOCSTR.format("Python", "docstring", func()))

''' output
Python はお馴染 docstring
最初と最後の改行も有効だけど print が最後を改行する
関数は format で実行すれば文字列さ
docstring は \ エスケープが有効
'''

あぁ楽チン、やっぱりコレだよコレ!

しかしやっぱりヒアドキュメントに変数を直書きできたほうが便利。
それには $ 記号を変数に利用する言語しか無理なんだろうな。
と思っていました。

// Vala

const string DOCSTR = """Python と同じ
%s も使える、でも ''' は使えない
何故か \\ エスケープ\nは使えない
""";

string func() { return "無理"; }

int main (string[] args) {
    string one = "Vala";
    string tow = "ヒアドキュメント";
    stdout.printf(@"$one は実は@\"\"を使って$towもどきが利用できる
ですが$${one}みたいなブレース表記はダメみたい
最初と最後の改行も有効、エスケープ文字 \\ は有効
記号は$$と\"を除いて <'{[+=~` と普通に使える
`func` は当然不可能\n\n");
    //
    stdout.printf(DOCSTR, "docstring");
    return 0;
}
/* output
Vala は実は@""を使ってヒアドキュメントもどきが利用できる
ですが${one}みたいなブレース表記はダメみたい
最初と最後の改行も有効、エスケープ文字 \ は有効
記号は$と"を除いて <'{[+=~` と普通に使える
`func` は当然不可能

Python と同じ
docstring も使える、でも ''' は使えない
何故か \\ エスケープ\nは使えない
*/

Vala はやってくれました。
おかげで解った、滅茶苦茶使い辛いということを。
これなら docstring 方式のほうがいいや。

最後に、Gedit の色分けってスゴすぎる!

gedit

まさかこの Vala の $ 変数を見分けて色分けするとは思わなかった。
PHP 部分と HTML 部分をしっかり見分けるとかは知っていたが。
どの言語でもヒアドキュメント内でマズい記号を打つと即座に色が変わる。
これがデフォルトエディタって GNOME 恐るべしだよ。

bash custom prompt $PS1

今頃知ったけど、bash のプロンプト文字列は変更できるようだ。
Fedora と Ubuntu で表示が違うのは単に変数の内容が違うだけだった。

How to: Change / Setup bash custom prompt (PS1)

早速 $PS1 の値を確認してみよう。

ubuntu_bash

$ echo $PS1

# Fedora Output
"[\u@\h \W]\$ "
# Ubuntu Output
"\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ "

Ubuntu はナンジャコリャだけど、\[\] で囲んだ内容は非表示属性のようだが。
echo $debian_chroot
は何も定義されていないみたいだし、Ubuntu では su は使えないし。
\u@\h:\w\$ だけでいいような?

ということで。
PS1 変数に指定子や記号を代入すればその値で表示されるようだ。
あの長ったらしくて困る Ubuntu のプロンプトを変更したかったので嬉しい。

\w を \W に変更するだけでいいようだが私的理由で Fedora と同じにする。
端末内で行ってもそのプロセス以外では反映されないので ~/.bashrc に指定。

bashrc

これで深い階層で端末を利用してもイラッとしなくなる。
現在位置の確認は pwd コマンドで充分、Fedora でそうしている。
もっと短くしたいなら \h のホスト名を消すという技もあるね。

本当は Windows の cmd.exe でこうしたいんだけど…

A better PROMPT for CMD.EXE or Cool Prompt Environment Variables and a nice transparent multi-prompt – Scott Hanselman

ロクなことできないなぁやっぱり。
そもそもホームをチルダ表示にできないから無意味だが。
PowerShell はチルダで cd 異動が可能なのに何故チルダにしなかったのか?

コマンドラインを強化せよ! – Windows 7のコマンドプロンプトをカスタマイズする (5) エイリアス機能でコマンドプロンプトを使いやすくする | マイナビニュース

コマンドはコレで似せることができるけど面倒臭いにもほどがある。
やっぱり Windows は糞だよ、Linux 慣れしすぎともいうが。

Ramen Timer for Ubuntu sh

以前 bash を使ってラーメンタイマーを作った。

Ramen Timer for bash

しかしイマイチ気に入らない、Ubuntu の sh は dash へのリンクだ。
普通に #!/bin/sh で始めたり sh に渡すと逆順連番が展開されない。

Almquist Shell – Wikipedia

dash でヤルなら seq を使うしか無いかな、知識が足りないからだろうけど。
seq は逆順にできないので sort で反転させれば上手くいくと思う。

ところで printf なんてコマンドがある。

#!/bin/sh

read -p "何色? :" pantu
printf "%sのパンツ\n" $pantu

echo より遥に解りやすい、C 言語の使い方で括弧やカンマが無いだけだし。
\r や \n エスケープが必要なところが自然に思えて逆に嬉しい。
しかし for 文に使うと何故か %d でも %s でもエラーになって困っていた。
今頃知ったのだが for 文の場合は %g を指定すればイケた。

そんなこんなで dash 版ラーメンタイマーを作ってみる。

#!/bin/sh

for i in `seq 180 | sort -n -r`
do
    printf "残り %g 秒  \r" $i
    sleep 1
done
echo でっきあっがりぃー

ちょっぴり進化したけど何か無駄を感じる…

Linux Trash GVfs

十月、Linux 関連は毎度のごとく半年に一度のバージョンアップ時期。
新しい環境を半年に一度楽しめる、何がどう進化したのか確認するのが楽しい。
グチャグチャになりかけた HDD 内データを整理するよい機会だから必ず別 HDD に新規インスコ。
その時点までの HDD バックアップができるオマケ付き、半年毎の OS 入れ替えはマジお勧め。
しかし…

GNOME 2.32 リリース・ノート

GNOME 3.0 で libgnomevfs が使えなくなるのをそろそろなんとかしなくては。
だって Y901x でしっかり利用しているんだもの。

ぱぇぽぃ2 ? Blog Archive ? Get MIME Type and Description

コレを使わずに MIME Type 取得か、どうやるのだ?
海外を探すと GObject や GIO を使えと出てくる。
色々探すと関係ないんだけど GVFS なんてものを見つけた。

GNOME には gvfs-trash なんてコマンドがあるのか。
もしかして…

$ gvfs-trash ファイル名

これでゴミ箱移動ができたのね…
トップページで公開している trash コマンドはどうしよう…

Ramen Timer for bash

時間を見つけては地味にシェルスクリプトの覚書に書きたししています。
ところで echo を man にてオプションを見てみると

-n で改行動作を行わない
-e でバックスラッシュによるエスケープ

ができるのか、単純に文字列そのままを stdout に出力するだけと勘違いしていた。

$ echo -e "きもー\tい\nあっちいけ\tてか死ね"
きもー い
あっちいけ   てか死ね
$

知ったからには何か作ってみないと気が済まない。
知って、積極的に書き出して、だけど何も作れない人、なんてマジで価値ゼロだもの。

#!/bin/bash

for i in {180..0}
do
    echo -e -n "$i  \r"
    sleep 1
done
echo timer_end

以上カップラーメンタイマーw

bash はこう書けば Python の range(整数) と同様に扱えるのね。
Ubuntu では bash 指定でないと dash になってしまうので /bin/bash 指定。
塗りつぶす必要がある部分は半角スペースで埋めておく、なるほどね。

よし新しいアプリとして公開、するようなシロモノじゃ無いよな。
ということで Blog に、どこかの知らない誰かの参考になればイイや。

どうでもいいが、先日原付でコケてしまい手を上げると鎖骨のあたりから激痛なう。
やっぱり折れている?
検索すると今の程度ならサポーター治療だけっぽいし、ほっとくべ。