bash」タグアーカイブ

Gedit External Tools

Gedit で外部ツールからスクリプト実行を筆者はよく使う。
今まで ContentType で振り分けしていた。
しかしコレでは gjs, jjs や Python, Python3 で振り分けできない。

考えてみたらシバンで実行すればいいじゃん。
+x パーミッションを付けない状態でもシバンを読取りすればいいのだし。
先頭に #! があればソレで、無いなら今までどおりにすればいいかな。

#!/bin/sh

# シバンがあるならソレで起動、無いなら ContentType 判別

h=`head -n1 $GEDIT_CURRENT_DOCUMENT_PATH`
if [[ $h = \#\!* ]]; then
    app=${h#*\!}
    echo $app $GEDIT_CURRENT_DOCUMENT_PATH
    $app $GEDIT_CURRENT_DOCUMENT_PATH
else
    echo @ContentType $GEDIT_CURRENT_DOCUMENT_TYPE
    if [[ $GEDIT_CURRENT_DOCUMENT_TYPE = *python ]]; then
        python3 $GEDIT_CURRENT_DOCUMENT_PATH
    elif [[ $GEDIT_CURRENT_DOCUMENT_TYPE = *javascript ]]; then
        gjs $GEDIT_CURRENT_DOCUMENT_PATH
    elif [[ $GEDIT_CURRENT_DOCUMENT_TYPE = *shellscript ]]; then
        sh $GEDIT_CURRENT_DOCUMENT_PATH
    elif [[ $GEDIT_CURRENT_DOCUMENT_TYPE = *vala ]]; then
        vala $GEDIT_CURRENT_DOCUMENT_PATH
    elif [[ $GEDIT_CURRENT_DOCUMENT_TYPE = *csrc ]]; then
        src=`head $GEDIT_CURRENT_DOCUMENT_PATH`
        case $src in
            *gtk.h*)
                echo "Gtk Build"
                gcc $GEDIT_CURRENT_DOCUMENT_PATH `pkg-config --cflags --libs gtk+-3.0` ;;
            *glib.h*)
                echo "GLib Build"
                gcc $GEDIT_CURRENT_DOCUMENT_PATH `pkg-config --cflags --libs glib-2.0` ;;
            *)
                echo "Gcc Build"
                gcc $GEDIT_CURRENT_DOCUMENT_PATH ;;
        esac
    else
        echo Non Support File
    fi
fi

これでもし他のスクリプト言語に目覚めてもシバンだけで対応できるぞ!
無いと思うけど。

bash =~

sh では存在しないコマンドを打つとなんか調べてくれる。
あれは command-not-found というものが行っているらしい。

Linux入門はじめますた: おせっかいな「command not found」

Fedora 25 で調べると以下のバイナリだった。
/usr/libexec/pk-command-not-found

ハンドラの定義は set コマンドで見ることができる。
随分違うなぁ、まあ 7 年も前の記事ですし。

どっちにしろ無効にしたい場合はやることは同じ。
command_not_found_handle 関数を ~/.bashrc で上書き…

いやチョットまて?

=~ 演算子って何だ!!!

Man page of BASH

にて =~ でページ内検索でなんとか。
正規表現マッチってことみたい。

だけど上記関数は i という文字が含まれているかどうかだけだよな?
それなら単純に文字列が含まれているかどうかも解るかも。

おぉ、Python の文字列 in 演算子のように使えるジャン!
こんな便利な使い方が検索で全然出てこないのは何故だYO!

file-roller command

忘れるところだった。
以前のように形式自由でアーカイブ可能な Nautilus Script を作らないと!

筆者は「新しくなったことを全否定する老人は死ね」な人間である。
でも今回は否定させて、だってデフォルトの機能では tar.gz が無いんだ。

7z なんて Kivy がソレで配布されていて mac でスゲー困ったし使いたくない。
GNOME はあの3形式以外は使ってほしく無いのかもだが流石に無理。
サルな人はすぐ昔のバージョンに戻そうとする、筆者は作る。

でも多数のアーカイブ形式に対応するって大変そう。
と思うけど実はもうソレをやっているものがあるんです。
file-roller はコマンドとして使えます。

file_roller

–add-to オプションで拡張子を指定すれば自動判別でアーカイブしてくれる。
ということでこんなシェルスクリプトを、拡張子のとうりな形式になります。

#!/bin/sh

path=`pwd`
name=${path##*/}
file-roller --add-to="${name}.tar.gz" "$@"

で。
Nautilus Script にコピーして送ってみる。

targz

これだけでで半角スペース及び日本語に対応。
以前と同じく親ディレクトリ名でアーカイブされる。

コレを Gjs なんかを使って GUI を以前みたく作って実行させればいい。
と思ったけどなんかコレで充分な気がしてきた。
Comipoli もやんなきゃいけないし、後は気が向いたら。

追記

下記だけで以前のダイアログが出せる、何を今頃だけど。

#!/bin/sh
file-roller --add "$@"

Mac gvfs-open

Mac で”デフォルトアプリにて開く”は open コマンド。
Linux の gvfs-open と同じ、説明が逆の気がするけど。

ということは Finder で /usr/bin を開くには

cd /usr/bin
open .

usr_bin

おぉ、コマンドからなら普通に開くことができるんだ。
open `pwd` でもいいけどドットのほうが簡単。

端末もいいけどたまに GUI でファイルを確認したい時があるのよ。
隠し属性ファイルを Finder に表示する必要なんて無いんだな。
finder コマンドが存在しなくて困っていたけどこんな方法が。

ドットディレクトリ内を探したい時は ls -a コマンドで。
Linux を使っている人なら常識だけど。

後はパスの通った場所にコレを用意して。

#!/bin/sh
open -a /Applications/Atom.app $@
#!/bin/sh
open -a /Applications/iHex.app $@

osx_support

よしコレでファイルの確認作業が格段に楽になった。
本当は Nautilus の拡張みたくやりたいけどまだ手段がワカラン。
iHex は無償だったので選んだけど確認用途なら十分かな。
しかしまあ、同じ UNIX というだけでありがたいYO!

Terminal.app

Fedora 使いが MacBook Air を使って約二週間。

実は一番困ったのが端末エミュレーター(Terminal.app)だったりする。
いや普通の人は端末はあまり使わないだろうけど。

Fedora のように Ctrl+D で終了すると bash のみが終了しウインドウが残る。
終了するには command+Q を使うのだが癖でつい何度もやってしまう。
exit を打たなければいけない某 OS よりはいいけど。

それと US キーボードなのにバックスラッシュが¥記号に。
コレは設定で変更できるようだ。

backslash

プロンプト表示でユーザー名が最後というのも気に入らない。
bash なので ~/.bash_profile で PS1 変数を指定すればいいはず。
gnome-terminal の使い方 – L’Isola di Niente
せっかくだから Fedora 等と同じように ~/.bashrc も用意して。

~/.bash_profile

if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

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

~/.bashrc

PS1='[\u@\h \W]$ '

を $HOME に用意して再ログイン。
見事に Fedora と同じプロンプトになりました。

ps1

ついでに Fedora デフォルト同様に ~/bin へのパスを通した。
ホームに bin ディレクトリを作りこんな感じのスクリプトを。

edit

#!/bin/bash

for param in $@; do
	open -a /Applications/TextEdit.app $param
done

edit

実行パーミッションン (chmod +x) を忘れずに。
これで Mac でも端末から GUI アプリが使えます。
Linux はこんなことしなくても使えるのに面倒臭い…

てゆーか、もっと Mac らしい使い方をしろよ俺。