FC2ブログ

本を読む

読書やコンピュータなどに関するメモ

Nautilusスクリプトのシェルスクリプトでファイル名を受け取る

 GNOMEのファイルマネージャーであるNautilus(ファイル)には、Nautilusスクリプトという仕組みがあります。Nautilusスクリプトを使うと、コンテキストメニュー(右クリックメニュー)から、Nautilus上で選択している1つまたは複数のファイル名を参照して、コマンドを実行できます。

 このNautilusスクリプトをシェルスクリプトで作る場合を考えます。題材としては、xzコマンドを1度だけ実行して、全ファイルを引数で渡す場合とします。なお、ファイル1つごとにxzコマンドを実行するものではありません(実用上はそれで問題ないのですが)。

ファイル名の受け取り方

 ファイル名のリストは、環境変数NAUTILUS_SCRIPT_SELECTED_FILE_PATHSで、1行1ファイル名の形式で渡されます。そのため、素朴な実装としては、次のように書けます。

#/bin/sh
xz $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS

 ただし、ファイル名に空白などが入っていると、そこで別の引数に区切られてしまいます。いやー、IFSとかで引数展開の区切りを指定できて、"$@"形式で展開できるといいんですが。たとえばこんな感じにできれば。

#/bin/sh
IFS='
' set -- $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
xz "$@"             # これはうまくいかない

 Bashの機能を使うのであれば、配列を使って書けるんですが。

#/bin/bash
mapfile -t ary <<<"$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
xz "${ary[@]}"

 まあこれ以上はPythonとかを使ったほうがいいでしょうね。

@satoh_fumiyasuさんの解

 てなことをTwitterでつぶやいたら、@satoh_fumiyasuさんがシェルで実現する解を考えてくれました

 ざっくりいうと、ラッパー関数を作り、それを呼び出すときにIFSを指定する方法ですね。

PDFtkはUbuntuのsnapで使える

 PDFtkは、PDFファイルに対してページ抽出や結合、回転など、いろいろな操作ができるコマンドラインツールです。しかし、PDFtkはGCJ(GNU Compile for Java)で作られていたため、GCC 7系以降でGCJが終了となって外されたことにより、今どきのOSでは簡単には使えません。

 と思っていたところ、PDFtkをDockerで使うという方法を聞きました。確かに、古いランタイムライブラリとそれを呼び出すプログラムを隔離環境で動かすのは理にかなっています。

 さてUbuntuでは、普通にコマンドとして使えるアプリケーションコンテナのパッケージとそのリポジトリとして、Snapがあります。もしかしてSnapでPDFtkがないだろうかと思って探してみたら、あっさり見つかりました。

$ snap find pdftk
Name          Version  Publisher  Notes  Summary
pdftk         2.02-4   smoser     -      command-line tool for working with PDF files
pdftk-smoser  2.02-4   smoser     -      command-line tool for working with PDF files [replaced by pdftk]

 2つあるうちの「pdftk-smoser」パッケージは、「pdftk」パッケージにに改名する前の古いものだそうです。というわけでpdftkパッケージをインストールします。

$ sudo snap install pdftk

 インストールしたら、こんな感じで普通に実行できます。

$ pdftk foo.pdf cat 2-3 output bar.pdf

 PDFtkの使い方については、適当にググってください。

 以上、「ただツールやライブラリの使い方を紹介するだけ」のエントリーでした。

私が聴いているLinux系ポッドキャスト(2020年3月版)

 ポッドキャストをいくつか聴いています。それらの中から、コンスタントに聴いているLinux系ポッドキャストを挙げておきます。

 なお、いずれも英語のポッドキャストです。これは単に、日本語のLinux系ポッドキャストが見つからなかったためです。私は英語が得意ではないので、フリートーク形式で毎回1時間以上のものは入っていません。

Linux Headlines
月〜金の毎日(欧米時間)、Linux関連ニュースを1回3分以内で読み上げる番組です。キャスターは数人が持ち回りで担当。3分以内なので、英語力も集中力もない私でも聴けます。Jupiter Broadcasting傘下。
Linux Action News
週1回でニュースとそれへのコメントを、2人のキャスターが語る形式です。1回30分弱ぐらい。Jupiter Broadcasting傘下で、Linux Action Showの後継?。
Choose Linux
毎回1つのLinuxディストリビューションを試した感想と、それに関連した話題を話し合う、トークショー形式のポッドキャストです。1回30分程度。Jupiter Broadcasting傘下。
This Week in Linux
週1回でニュースとそれへのコメントを、1人のキャスターが語る形式です。40〜50分ぐらい。TuxDigital傘下。
Command Line Heroes
Red Hatによるポッドキャストです。OSSやコンピュータ、プログラミングあたりに関する歴史の話を、1人のキャスターの語りに関係者の証言をまじえた教養番組形式で紹介しています。1回30分程度。
Ubuntu Security Podcast
Ubuntuで対応したセキュリティアップデートと対処問題を週1回で紹介する、Ubuntuのセキュリティチームの人によるポッドキャストです。gihyo.jpの「Ubuntu Weekly Topics」の「今週のセキュリティアップデート」コーナーに近い感じ。最近は、後半に対談形式のトークも入っています。1回20分前後ぐらい。

技術カンファレンスWSLConf 2020をちょっと覗いた

 WSL(Windows Subsystem for Linux)に関する技術カンファレンス「WSLConf 2020」が、MicrosoftとCanonicalにより2020年3月10日〜3月11日に開催されました。

 本当はレドモンドで開催されるはずだったのですが、COVID-19アウトブレイクでオンライン(Bluejeans)開催になりました。しかも、なぜかスケジュールが東海岸時間に(レドモンドとロンドンの間をとったのでしょうか)。これを幸いと、スケジュール上の午前のセッションだけちょっと覗きました。

 タイミング的にWSL2の話が多かったなとか、その流れでDocker/Kubrenetesネタも目立ったなとか、WSL専用ディストロのPengwin(旧名WLinux)関係者もけっこう出てたなとか思いました。あと、オンライン開催だと休憩時間がなかったりするなあとか。

 以下、レポート。

Welcome Remarks + Team Updates(Sohini Roy / Hayden Barnes / Craig Loewen)

 オープニングトークとして、中心メンバーが挨拶しました。

 CanonicalのHayden Barnesは、2016年にBash on Ubuntu on Windowsが発表されて、1年前にWSL2が発表され、もうすぐshippingされると話しました。

 Sohini Royは、WSLがコミュニティで広がってディストロも集まったことを紹介し、「Telegramチャンネルに参加しよう」「フィードバックしよう」と話しました。

オープニングトークのHayden BarnesとSohini Roy

 Craig Lowenは、MicrosoftのWSLのProgram Managerです。VS Codeとのインテグレーションや、Visual Studioとのインテグレーション、関連プロダクトのPowerShellやWindows Terminalなどを紹介しました。さらに、いろいろなWSL上にさまざまなディストロが登場していることに触れ、「Thank you to distros」と語りました。

 ちなみに、ゲーム会社のEA(Electronic Arts)が開発でVisual StudioとWSLのインテグレーションを活用しているとか。

Craig Lowen「Thank you to distros」

Terminal Team Update(Kayla Cinnamon)

 Windows TermianlのProgram Managerの人です。Windows Terminalのいろいろな機能をデモしていました。

 たとえば表示からの検索やら、設定JSONでカスタマイズして特定ディストロ対応設定を作ったり。あとVS CodeでJSONを編集するときに、JSON Schemaから値の候補を出したり、色をカラーピッカーで選んだり。

Windows Terminalの設定JSONをVS Codeで編集

 そのほか、Midnight Commanderを開いてマウスイベントを拾うところや、そのへんにバグがあって直した話などもありました。

Windows TerminalのWSLでMidnight Commander

Distro Reports(Pengwin, Kali, and Ubuntu teams)

 WSL上のディストロとして、Ubuntu、Pengwin、Kali Linuxから短い近況報告がありました。

 Ubuntu(Hayden Barnes)については、次のUbuntu 20.04の話をしていました。

 Pengwin(Carlos Ramirez Castilio)は、TUIのセットアップツールのpengwin-setupの紹介や、GUIを動かすところ、Qtサポート強化などを動画でデモ。さらに最新状況として、GNOME TerminalやKonsoleといったさまざまなターミナルエミュレーターをインストールして動かすところをデモしました。

PengwinのCarlos Ramirez
さまざまなターミナルエミュレーターをインストール

 ペネストレーションテストのディストロのKali Linux(Steev Klimaszewski)は、最新状況として、ビルドの自動化に取り組んでいると離していました。

Kali LinuxのSteev Klimaszewski

How We Use WSL at Kali(Steev Klimaszewski)

 Steev Klimaszewskiはそのまま、Kali Linuxのセッションに。難しい点としてはWSLからの外部ハードウェアのアクセスが語られました。

 デモとして、WindowsのPowerShellからKaliをAppxでインストールし、ツールをaptでインストールし、msfconsoleを起動してユーザーリスト取得などを実行していました。

WSL上のKali Linuxからmsfconsoleでユーザーリスト取得

Inside Docker Desktop with WSL 2(Simon Ferquel)

 Docker社のSimon Ferquelが、Docker Desktop for WSLについて解説しました。Docker Desktopのアーキテクチャーについても説明がありました。

Docker Desktopのアーキテクチャー(全体)
Docker Desktopのアーキテクチャー(詳細)

 そのあとでデモ。Visual Studioを使ってDocker Desktop for WSLの中身のコードにブレークポイントを張り、一方でWSLからコンテナの中に入ったりして、コードを実行していきながらコンテナができて実行されていくところが細かく解説されました。

Docker Desktop for WSLの中身をVisual Studioのデバッガで追跡

microk8s on WSL2(Nuno Do Carmo)

 Microsoft MVPのNuno Do Carmoが、Canonicalによるシングルノード用Kubrenetes環境microk8sをWSL 2で動かすところをデモしました。microk8sはUbuntuのsnapでインストールできて、microk8s.*やmkといったコマンドで環境を構築するとのこと。サービスメッシュのMesheryやLinkerDまで含めてデモしていました。

microk8sの紹介
MesheryとLinkerD

Unleash your IoT development tools with WSL(Francesco Valerio Buccoli / Marco Dal Pino)

 ここから2日目。

 MicrosoftのFrancesco Valerio Buccoliと、Projest SpAのMarco Dal Pinoが、組み込みLinux開発ツールチェーンのYoctoをWSLで使って開発する方法を解説しました。

 WSLのセッションなのに1990年代のWindows CE向け開発の話から始まり、組み込みLinuxの話に。そして、ビルドホストと各種開発マシンで開発環境を揃えるためにWSLを使う、という話でした。

Windows CEの話から始まる
Yocto開発環境を揃えるためにWSL

WSL2 Deep Dive/History/Q&A(Craig Loewen / Ben Hillis)

 WSLに関するQ&A形式のセッションが、WSLのProgram ManagerのCraig Loewenと、WSLのSenior Software EngineerのBen Hillisのかけあい形式で行なわれました。

 WSLはもともとWindows Phoneの機能として開発されたとか、WSL2をリリースした後はファイルシステムパフォーマンスやネットワークの改善に取り組むとか、WSL1もサポートを続けるとか、Linuxカーネル5.xへの移行中とか、ベストなエクスペリエンスになるよう9pに対応したとか、Rustはawesomeでセキュアな言語なので興味あるとか、LCOWチームはGoが好きとか。

 その合間に、いろいろデモもありました。WSL上のUbuntuとAlpineの間でファイルコピーしたり、大きなメモリをアロケートして開放するだけのプログラムを繰り返し実行してメモリの開放をモニタリングしたり。あと、開発版のWindows 10では、Windowsエクスプローラーの「Linux」の項目の下に、WSLディストリビューション名が並ぶところも興味深いものでした。

WSL上のUbuntuとAlpineの間でファイルコピー
メモリの開放をモニタリング
開発版のWindows 10ではエクスプローラーにWSLディストリビューションが(拡大表示したところ)

Cross-platform GUI applications with JetBrains Tools on WSL(Carlos Ramirez)

 PengwinのLead DeveloperのCarlos Ramirezが、WindosとLinuxとでアプリケーションを同じように動かす方法を解説しました。メインは、IDEのClionの上でQtでGUIを作る方法で、サンプルは時間管理アプリのToggl。WindowsアプリとLinuxアプリを、プラットフォームごとのコードを含むワンソースで管理するのを紹介しました。

ToggleがWindowsとWSL上のLinuxとで動作

 ちなみにその中で、Pengwinのセットアップも紹介していました。pengwin-setupでVcXSrvの設定もできるとか。

pengwin-setupでVcXSrvの設定

 そのほか、WSLのLinux上のWineでWindowアプリ(サンプルはWinMerge)を動かすという、ちょっと酔狂なクラスプラットフォームの方法も紹介されてました。

Windows上のLinux上のWineでWindowsアプリが動作

台割のExcelファイルをRubyで自動生成する方法の入口

 このエントリーは「書き手と編み手の Advent Calendar 2019」の12月4日分の記事です。

 紙の書籍を編集や制作した経験のある人にとって、台割はおなじみのものです。なお、ここでは台割とは何かについては省略します。

 自分の見てきたIT系出版の世界では、台割をExcelで作ることが多いようです。台割では、最初のほうの章のページ数が変わったりすると、それ以降をずらす必要があって大変です。そのため、Excelのマクロなどを使って自動化する人もけっこういるのではないかと思います。

 ここでは、Ruby言語のコードを使って台割のExcelファイル(.xlsxファイル)を生成するのを目標に、その方法の入口を解説します。あくまで入口であって、台割が完成するところまでは説明しません。

 つまりは、「ただツールやライブラリの使い方を紹介するだけ」のエントリーってやつです。

注意

  • 対象は広義の平綴じ(無線綴じなどを含む、中綴じでない書籍)用の台割です
  • Ruby言語の解説は割愛します
  • Ruby処理系やライブラリのインストール方法にまつわることについても割愛します

ステップ0:axlsxをインストールする

 Rubyで.xlsxファイルを生成するには、axlsxというライブラリを使うと便利です。

 gemやbundleなどで「axlx」をインストールします。ただし、執筆時点では、axlsxのリリース版だと最近のRubyでは警告が出るので、「3.0.0.pre」版を指定してインストールします。

$ gem install axlsx -v 3.0.0.pre

 axslxはnokogiriというライブラリに依存しているので、それまでにインストールされていなければいっしょにインストールされます。

 なお、axlsxからフォークしたaxlsx-altというライブラリもあるようですが、私は未評価です。

ステップ1:空の.xlsxファイルを出力する

 とりあえず、何もせずに空の.xlsxファイルを出力してみます。以下のような内容のsample.rbファイルを作ります。

require 'axlsx'

Axlsx::Package.new do |pkg|
  pkg.serialize('out.xlsx')
end

 Axlsx::Package#serializeがファイル出力です。

 これを実行すると、out.xlsxというファイル名の、何も書かれていない.xlsxファイルが作られます。

$ ruby sample.rb

ステップ2:1行書き込む

 out.xlsxを出力するプログラムに、表に1行を追加するコードを追加します。

require 'axlsx'

Axlsx::Package.new do |pkg|
  wb = pkg.workbook
  wb.add_worksheet(name: 'シート1') do |sheet|
    sheet.add_row(['折', '通', nil])
  end

  pkg.serialize('out.xlsx')
end

 Axlsx::Package#workbookでExcelのブックを取得し、そのブックのadd_worksheetでExcelの(ワーク)シートを作成します。そして、そのシートのadd_rowで“折”と“通”と空の3つのセルがある行を追加します。

 生成されたExcelファイルは、こんな感じです。

ステップ2の結果

ステップ3:列幅を指定する

 このままでは、どの列も同じデフォルトの幅なので、列幅を変更します。各列の幅は、シートのcolumn_widthsで指定します。

    sheet.column_widths(4, 4, 20)

 column_widthを呼び出すのは、add_rowより後のほうがいいようです。追加後のコードは以下のとおりです。

require 'axlsx'

Axlsx::Package.new do |pkg|
  wb = pkg.workbook
  wb.add_worksheet(name: 'シート1') do |sheet|
    sheet.add_row(['折', '通', nil])
    sheet.column_widths(4, 4, 20)
end

  pkg.serialize('out.xlsx')
end

 生成されたExcelファイルは、こんな感じです。

ステップ3の結果

ステップ4:セルのスタイルを指定する

 ここまでで書き込んでいる1行は、表のタイトル行にします。そのため、文字は太字で、セルは罫線で囲んだものにします。

 まず、ブックに対してスタイルを定義します。ここでは、表の通常行でも使うように、罫線の形式を指定するHashを変数bordersで参照できるようにしておきます。

  styles = wb.styles
  borders = { style: :thin, color: '000000' }
  title_style = styles.add_style(b: true, border: borders)

 add_rowを記述を変更して、定義したスタイルの指定を追加します。

    sheet.add_row(['折', '通', nil], style: title_style)

 これらを反映したコードは以下のとおりです。

require 'axlsx'

Axlsx::Package.new do |pkg|
  wb = pkg.workbook

  styles = wb.styles
  borders = { style: :thin, color: '000000' }
  title_style = styles.add_style(b: true, border: borders)

  wb.add_worksheet(name: 'シート1') do |sheet|
    sheet.add_row(['折', '通', nil], style: title_style)
    sheet.column_widths(4, 4, 20)
  end

  pkg.serialize('out.xlsx')
end

 生成されたExcelファイルは、こんな感じです。

ステップ4の結果

ステップ5:通常行を追加する

 タイトル行だけでなく通常行も追加しましょう。

 まず通常行のスタイル定義を追加します。

  body_style = styles.add_style(alignment: { vertical: :top }, border: borders)

 タイトル行の定義から太字指定を抜いて、垂直位置の指定を追加したものです。

 通常行もadd_rowで追加します。実用性はありませんが、ここでは内容は決めうちで。

    sheet.add_row([1, 1, '本扉'], style: body_style)
    sheet.add_row([1, 2, '商標'], style: body_style)
    sheet.add_row([1, 3, '前書き'], style: body_style)
    sheet.add_row([1, 4, nil], style: body_style)
    sheet.add_row([1, 5, nil], style: body_style)
    sheet.add_row([1, 6, '目次'], style: body_style)
    sheet.add_row([1, 7, nil], style: body_style)
    sheet.add_row([1, 8, nil], style: body_style)
    sheet.add_row([1, 9, nil], style: body_style)
    sheet.add_row([1, 10, nil], style: body_style)
    sheet.add_row([1, 11, '1章'], style: body_style)
    sheet.add_row([1, 12, nil], style: body_style)
    sheet.add_row([1, 13, nil], style: body_style)
    sheet.add_row([1, 14, nil], style: body_style)
    sheet.add_row([1, 15, nil], style: body_style)
    sheet.add_row([1, 16, nil], style: body_style)

 これらを追加したコードは以下のとおりです。

require 'axlsx'

Axlsx::Package.new do |pkg|
  wb = pkg.workbook

  styles = wb.styles
  borders = { style: :thin, color: '000000' }
  title_style = styles.add_style(b: true, border: borders)
  body_style = styles.add_style(alignment: { vertical: :top }, border: borders)

  wb.add_worksheet(name: 'シート1') do |sheet|
    sheet.add_row(['折', '通', nil], style: title_style)
    sheet.add_row([1, 1, '本扉'], style: body_style)
    sheet.add_row([1, 2, '商標'], style: body_style)
    sheet.add_row([1, 3, '前書き'], style: body_style)
    sheet.add_row([1, 4, nil], style: body_style)
    sheet.add_row([1, 5, nil], style: body_style)
    sheet.add_row([1, 6, '目次'], style: body_style)
    sheet.add_row([1, 7, nil], style: body_style)
    sheet.add_row([1, 8, nil], style: body_style)
    sheet.add_row([1, 9, nil], style: body_style)
    sheet.add_row([1, 10, nil], style: body_style)
    sheet.add_row([1, 11, '1章'], style: body_style)
    sheet.add_row([1, 12, nil], style: body_style)
    sheet.add_row([1, 13, nil], style: body_style)
    sheet.add_row([1, 14, nil], style: body_style)
    sheet.add_row([1, 15, nil], style: body_style)
    sheet.add_row([1, 16, nil], style: body_style)
    sheet.column_widths(4, 4, 20)
  end

  pkg.serialize('out.xlsx')
end

 生成されたExcelファイルは、こんな感じです。

ステップ5の結果

ステップ6:セルを連結する

 折(台)を示すセルは折(台)ごとに共通です。そのため、セルを連結してみます。

 シートのmerge_cellsを呼び出します。

    sheet.merge_cells('A2:A17')

 これらを追加したコードは以下のとおりです。

require 'axlsx'

Axlsx::Package.new do |pkg|
  wb = pkg.workbook

  styles = wb.styles
  borders = { style: :thin, color: '000000' }
  title_style = styles.add_style(b: true, border: borders)
  body_style = styles.add_style(alignment: { vertical: :top }, border: borders)

  wb.add_worksheet(name: 'シート1') do |sheet|
    sheet.add_row(['折', '通', nil], style: title_style)
    sheet.add_row([1, 1, '本扉'], style: body_style)
    sheet.add_row([1, 2, '商標'], style: body_style)
    sheet.add_row([1, 3, '前書き'], style: body_style)
    sheet.add_row([1, 4, nil], style: body_style)
    sheet.add_row([1, 5, nil], style: body_style)
    sheet.add_row([1, 6, '目次'], style: body_style)
    sheet.add_row([1, 7, nil], style: body_style)
    sheet.add_row([1, 8, nil], style: body_style)
    sheet.add_row([1, 9, nil], style: body_style)
    sheet.add_row([1, 10, nil], style: body_style)
    sheet.add_row([1, 11, '1章'], style: body_style)
    sheet.add_row([1, 12, nil], style: body_style)
    sheet.add_row([1, 13, nil], style: body_style)
    sheet.add_row([1, 14, nil], style: body_style)
    sheet.add_row([1, 15, nil], style: body_style)
    sheet.add_row([1, 16, nil], style: body_style)
    sheet.column_widths(4, 4, 20)

    sheet.merge_cells('A2:A17')
  end

  pkg.serialize('out.xlsx')
end

 生成されたExcelファイルは、こんな感じです。

ステップ6の結果

その先

 このエントリーでは、1折(台)ぶんだけ決めうちで台割を作りました。これだけでは実用性はありませんが、作り方によっていろいろ楽ができるようになります。

 たとえば、章とそのページ数を記述したデータを用意して、そこから台割を生成するという応用が考えられます。また、章ごとのPDFファイルからページ数をカウントして台割を生成するという応用も考えられるでしょう。

 さらには、文字サイズや表のレイアウト、修飾スタイル、表本体以外の記載事項など、いろいろ工夫できる要素もあります。

 このエントリーがそのような自動化のヒントになれば幸いです。

UbuntuのconvertでPDFに変換するには設定変更が必要

 フリーランスで仕事をしていると「書類をプリントアウトして押印し、スキャンして提出」という作業が求められることがよくあります。

 JPEGなどの画像ファイルからPDFに変換するとき、ImageMagickのconvertコマンドを使うと、コマンドラインから一発で変換できます。JPEGからA4のPDFを作るには、こんな感じで。

$ convert -density 72 -page a4 shorui.jpg shorui.pdf

 ただし、最近のUbuntuのconvertでは、セキュリティ上の理由から、デフォルトではPDFの変換が許可されていません。そのため、そのまま実行するとエラーになります。

convert: not authorized `shorui.pdf' @ error/constitute.c/WriteImage/1028

 そこで、設定を変更します。/etc/ImageMagick-6/policy.xmlファイルを、管理者権限のテキストエディタで開きます。

$ sudo vi /etc/ImageMagick-6/policy.xml

 ここで、PDFの設定の箇所を見つけて、以下のように書き換えて保存します。

  <policy domain="coder" rights="none" pattern="PDF" />
            ↓
  <policy domain="coder" rights="read|write" pattern="PDF" />

 これで、変換が実行できるようになりました。

参考:convert - Error during converting jpg to pdf - Ask Ubuntu

lessで.odtや.docxを表示できるようにする

 TwitterでLibreOffice日本語チームが、ODFを「soffice --cat」でテキスト表示するというワザを紹介していました。

 --convert-toとかは知っていましたが、--catは知りませんでした。

 さっそくlessコマンドに仕込んでみます。

 多くのLinuxディストロではデフォルト設定で、lessにlesspipeを組み合わせるようになっています。たとえばlessに.pdfが与えられたらテキストにしてlessで表示、.zipや.tar.xzが与えられたらファイル一覧をlessで表示、という具合です。

 このlesspipeを個人的に拡張するには、~/.lessfilterというシェルスクリプトのファイルを作り、フィルター処理を書きます。

case `echo "$1" | tr '[:upper:]' '[:lower:]'` in
        *.odt|*.docx|*.doc)
                if [ -x "$(command -v soffice)" ]; then soffice --cat "$1";
                else echo "No LibreOffice or OpenOffice available"; fi ;;
        *)
                exit 1;;
esac

exit 0

 目的のファイル名だったら処理してexit 0することでlesspipe処理を終了、それ以外のファイル名だったらexit 1することで通常のlesspipe処理にフォールバック、という内容です。lesspipeの内容を参考にして(枠組をコピペして)書きました。

 ~/.lessfilterには実行権をつけておきます。

$ chmod +x ~/.lessfilter

 これで、メールで送られてきた.docxファイルも、さっとlessで確認できるようになりました。

$ less foo.docx

 めでたしめでたし。

 | HOME |  »

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly