つれづれ電脳記(日くらしPCに向かひて)

つれづれなるままに、日くらしPCに向かひて、その悪戦苦闘ぶりをそこはかとなく書き付くるおじさん。たまに雑談[管理人:goosyun]

つれづれなるままに、日くらしPCに向かひて、デジタル関係の悪戦苦闘ぶりをそこはかとなく書き付くるおじさんです。
たまに雑談してます。連絡・問い合わせフォームは、ページ最下部に置いています。[著者(運営人):goosyun]

(当ブログには本文中に広告リンクが含まれています。)

LibreOfficeマクロで外部プログラム起動(Shell関数でBashスクリプト)

LibreOffice Calc 画面

1 LibreOffice Basicマクロ

 LibreOffice は、オープンソースのオフィスソフトです。
 マクロ機能があり、WriterドキュメントやCalcシート上にボタンを配置し、ボタンクリックでマクロの実行ができます。クリック一つで自動処理してくれるので、とても便利です。
 ただ、ただですね、LibreOffice Basic というプログラミング言語での記述が必要です。いつかLibreOffice Basic を本格的に勉強しようかと思いつつ、いまだ手をつけていません。最近は、BashシェルやPowerShellに関心が向いていて、そちらの知識を習得中です。
 そうした中、LibreOffice Basic マクロの中で、BsshスクリプトやPowerShellスクリプトを起動させる方法があると知りました。Basic言語に用意されているShell関数です。Shellは、LibreOffice Basicマクロ内で外部プログラムやコマンドを実行する関数です。
 このShell関数を使うのが最善、というわけでもないでしょう。ただ、今の私にとっては、このShell関数はとてもありがたく、便利な存在です。

 

2 Shell関数の文法

 LibreOffice Basicにおける Shell 関数の文法は以下のとおりです。
  戻り値 = Shell( Path, Windowstyle, Param, Sync )

1.Path (必須 / 文字列)
 実行したいプログラムやスクリプトのフルパスを指定します。
2.Windowstyle (整数)
 プログラムを起動するときのウィンドウの見た目を指定します(0はプログラムウィンドウを非表示にして、1 は通常のウィンドウでアクティブにします)。
3.Param (省略可能 / 文字列)
 プログラムに渡したい引数(パラメータ)がある場合にここに書きます。
 •例: /home/hoge/script.sh に引数 dat.txt を渡したい場合、Param = "dat.txt" とします。
4.Sync (省略可能 / ブール値 True または False)
 •False(デフォルト):スクリプトの終了を待たない(非同期)。
 •True:スクリプトが完全に終了するまでCalc側のマクロを一時停止する。

 

3 スクリプト実行画面が出ない問題

 上記2の文法に従って、次のマクロコードを記述しました。
   Sub RunMysh
       Dim scriptPath As String
       scriptPath = "/home/Hoge/path/to/my_script.sh"
       Shell(scriptPath, 1)
   End Sub
 実行権限を付けたら、my_script.shの実行ができるようになりました。
 ところが、ここでつまづいてしまいました。スクリプトの実行はされるけれども、スクリプト実行画面が出てこないのです。Windowstyle引数に ウィンドウ表示の値1を指定しているのになぜだ・・・、となりました。
 実は、LibreOfficeの Shell 関数は、Linuxにおいては「ターミナルというアプリ(画面)を起動する」のではなく、「Bashというプログラムの中身(シェル)だけを直接、画面なしで裏で実行する。」という動きをします。
 そのため、Windowstyle に 1(ウィンドウを表示する)を指定しても、そもそも表示すべき「ウィンドウ(画面)」が最初から存在しないというわけです。だから、何も表示されません。
 調べてみたら、上記のような仕組みとなっているようです。そのことを、ようやく突き止めました。

 

4 画面非表示問題の解決策

 上記の問題を解決するために、gnome-terminalを起動させ、その中でスクリプトの実行をさせることにしました。
 具体的には、次のようなコードとなります。
1 Bashスクリプトの実行
 Sub RunMyBashScript
  Dim cmd As String
  cmd = "gnome-terminal -- bash -c '/home/Hoge/path/my_script.sh; exec bash'"
  Shell(cmd, 1)
 End Sub
2 PowerShellスクリプトの実行
 Sub RunPowerShellScript
  Dim cmd As String
  cmd = "gnome-terminal -- pwsh -File '/home/Hoge/path/my_script.ps1'"
  Shell(cmd, 1)
 End Sub
 上記1と2のコード中、ちょっと分かりにくいのが、gnome-terminal直後の「 -- 」です。これは gnome-terminal に対する特殊な引数(オプション)です。
 「ここから後ろに書くのは、ターミナルの中で実行するコマンドである」という境界線(区切り)を意味しています。

 

5 ターミナル表示を残す工夫

 Bashスクリプトを実行するマクロの中に入っている「exec bash」は、スクリプト終了直後にターミナルが勝手に閉じてしまうのを防ぐ呪文です。
 PowerShellの方も、実行後にターミナル画面を残すために、PowerShell スクリプト(my_script.ps1)の一番最後の行に、以下のコードを追記しています。
 # my_script.ps1 の末尾に追記
 Read-Host "Enterキーを押すと終了します..."
 これで、スクリプトの実行後もターミナル画面が消えるのを防ぐことができます。

 以上のように、理解するまでちょっと苦労しましたが、外部プログラムを起動してくれるShell関数は、とても便利です。

 それではまた次の記事で。
   goosyun