GIOChannel(Gjs) Tips
# 最終更新日 2020.08.02
標準入出力
GIOChannel はファイルディスクリプタという UNIX 系の昔ながらの入出力 Gio は gvfs にて仮想化による柔軟な入出力、という認識でいいようです JavaScript 文字列と UTF-8 文字列は全自動で相互変換される
#!/usr/bin/gjs const GLib = imports.gi.GLib; // ファイルディスクリプタの stdin=0 にアクセス let channel = GLib.IOChannel.unix_new(0); // プロンプトの表示 channel.write_chars('何か入力してください > ', -1); // フラッシュしないと反映されない、close は非推奨 channel.flush(); // ファイルディスクリプタの stdout=1 にアクセス let channel2 = GLib.IOChannel.unix_new(1); // stdout のデータを読み込む let [status, str_return] = channel2.read_line(); // 行末の \n を取り除く let s = str_return.trimEnd(); print(`[${s}] が入力されました`); // 抜けると自動破棄されるけど必要なら以下を //channel.shutdown(true); //channel2.shutdown(true);
ファイルの読み書き
一揆に読み込むとやはり Uint8Array で戻ってきます 一行毎に読み込みすればそのまま JavaScript 文字列として扱える
#!/usr/bin/gjs const GLib = imports.gi.GLib; const ByteArray = imports.byteArray; let s = 'abcdefg\nあいうえお\n3行目'; let channel = GLib.IOChannel.new_file('output.txt', 'w'); channel.write_chars(s, -1); channel.shutdown(true); let channel2 = GLib.IOChannel.new_file('output.txt', 'r'); // 全部読み込む場合は配列で戻ってくる、ByteArray 必須 let [status, str_return] = channel2.read_to_end(); print(ByteArray.toString(str_return)); // 一行毎に処理の場合は js 文字列で戻ってくる、統一してよ... /* for (;;) { let [status, str_return] = channel2.read_line(); if (status == GLib.IOStatus.EOF) break; // 行末の \n を取り除く print(str_return.trimEnd()); }*/ channel2.shutdown(true);
パイプ入力との振り分け
標準入力に値があるかどうかで見分けられます
#!/usr/bin/gjs const GLib = imports.gi.GLib; // stdin=0 stdout=1 let channel = GLib.IOChannel.unix_new(0); if (channel.get_flags() == GLib.IOFlags.IS_READABLE) { /* -- Pipe -- */ let [status, str_return] = channel.read_to_end(); // toString が必要 let s = str_return.toString().slice(0, -1); print(`[${s}] がパイプから渡されました`); } else { /* -- stdin -- */ print('パイプから渡してください'); }
Copyright(C) sasakima-nao All rights reserved 2002 --- 2023.