PentahoのシェルスクリプトがWindowsで動作しなかった経験を整理しつつ、LinuxとWindowsの違いを学ぶ

はじめに

本日の業務で、pentahoのシェルスクリプトというステップの実行が上手くいかなかった。

それが書かれたジョブファイルを実行したら、ログに赤い文字でエラーメッセージが書かれていた。

pentahoのシェルスクリプトでやろうとしていたこと

202401010000.csvというようなファイルから、指定した日数分だけ前のファイルを取得してリスト化していた。

ステップ名はシェルスクリプト作成。

そのジョブファイルを実行したところエラーが発生した。

実行したシェルスクリプトは以下のようなbashスクリプト。

#!/bin/bash

# 現在の日付を取得
TODAY=$(date +%Y%m%d0000)

# 過去n日分のファイルリストを作成
DAYS_BACK=5  # 取得する日数
for ((i=0; i<$DAYS_BACK; i++)); do
    FILE_DATE=$(date -d "-$i day" +%Y%m%d0000)
    echo "取得ファイル: ${FILE_DATE}.csv"
done

bashとは、UNIXやLinux系OSで広く使われているシェル。

以下では、現在の日付を「YYYYMMDD0000」というフォーマットで取得して、環境変数TODAYに格納している。dateコマンドは、Windowsのcmd(Windowsのコマンドプロンプト)では使えない。

# 現在の日付を取得
TODAY=$(date +%Y%m%d0000)

Windowsのcmd.exeで現在の日付を表示するには、date /t、または、echo %DATE%を実行する。

-d "-$i day"では、過去の日付を取得している。Windows環境では、PowerShellで以下のように代用する必要がある。

(Get-Date).AddDays(-5).ToString("yyyyMMdd")

エラー原因

生成AIに相談したところ、pentahoで生成されたシェルスクリプトはlinuxでの実行を前提として作られており、windows環境ではエラーが発生するとのこと。その理由は以下の通り。

  1. Pentahoは、Linux用のシェルスクリプトを生成する。
  2. Windowsでは、デフォルトのcmd.exeでは.shを実行できない。

エラーメッセージは文字化けしていて何が書いてあるかわからなかった。原因は、文字コードが違うから。WindowsはShift_JIS、LinuxはUTF-8。

文字コードを確認・変換するには、chcpコマンド(Windowsの場合)や、iconvコマンド(Linux/macOSの場合)を使用する。

Git Bash / WSL / Cygwinなどを使用すれば、Windowで.shを実行できる。

2>&1 | tee error.logでエラー内容をログに出力して、文字コードを変換すれば、文字化けが直る可能性がある。

知識の整理

linuxとwindows、それぞれのシェルファイルについての知識をここでまとめておこう。

コマンドの違いなどがある。

項目Linux(bash, sh)Windows(cmd.exe, PowerShell)
実行ファイル拡張子.sh.bat, .cmd, .psl
コマンドls, cp, mv, rm, grepdir, copy, move, del, findstr
パスの書き方/home/user/file.txtC:\Users\file.txt

今使っているmacbookで簡単なシェルスクリプトを作成して実行してみた

百聞は一見にしかずということで、実際に試してみよう。

MacはLinuxに近いUnix系のOSなので、bashをそのまま使える。

shellというフォルダをダウンロードフォルダに作成して、VSCodeで開いた。

まずは、このスクリプトを実行する際に使用するインタープリタ(シェル)を指定するために、シェバンを記述する。Bashシェルを使ってスクリプトを実行できるようにする。

#!/bin/bash

現在のディレクトリを出力するコードを書く。

echo "現在のディレクトリ: $(pwd)"

続いて、今日の日付を出力するコードを書く。

echo "今日の日付: $(date +%Y%m%d)"

test.shの全体は以下の通り。

#!/bin/bash
echo "現在のディレクトリ: $(pwd)"
echo "今日の日付: $(date +%Y%m%d)"

test.shの実行権限を与えるために以下のコマンドをターミナルで実行する。

Mac:shell shibatahiroshitaka$ chmod +x test.sh

そして、test.shを実行する。

Mac:shell shibatahiroshitaka$ ./test.sh
現在のディレクトリ: /Users/shibatahiroshitaka/Downloads/shell
今日の日付: 20250304

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

投稿ID : 28891