Mac/Linux間でシェルスクリプトの絶対パスやdateの違いを吸収する|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。CONTACTTOP開発Mac/Linux間でシェルスクリプトの絶対パスやdateの違いを吸収する開発2016.09.12Mac/Linux間でシェルスクリプトの絶対パスやdateの違いを吸収するhachi8833シェアツイートブックマークLINEこんにちは、hachi8833です。BPS社内Slackの#macチャンネルのやりとりからです。パスとdateをPerlで取得perlのrel2abs()で絶対パスを取得し、strftime()で日時を数字のみで取得しています。localtime)")も少し短く続いて「こっちならもうちょっと短いよー」との意見も出ました。Cwd::abs_path(".")'perlならMacとLinuxの両方でほぼ確実に利用できます。凝ったコードにするとperlのバージョンの互換性の問題が生じるかもしれないので、このようなワンライナーにとどめておくのがよいでしょう。それにしても、Dockerコンテナ化されたプロジェクトならこういうことを気にせずに安心してシェルスクリプトを書けるのにと思います。Rubyで書いてみた今回の目的では使いませんが、Rubyで書くと次のような感じになりますね。Time.now.strftime('%Y%m%d%H%M%S')")補足:プラットフォーム互換についてネタ元のmorimorihogeです。小さなシェルスクリプトはWeb系エンジニアは嗜みとして利用されていると思います。taskを呼び出したり非同期実行であればDelayed::JobやResque、Sidekiqを使えば、ディストリビューションに依存しないバッチ処理が作成できて問題も少ないので、基本的にはそちらに倒すと楽ができます。Webアプリを開発するチームとインフラ管理をしているチームが責任範囲や組織的に分かれている場合には、お互いの共通言語ということでシェルスクリプトを使うのがトラブルが少ないでしょう。インフラ周りを担当されているエンジニアがある程度のルールを持っている場合、シェルスクリプトで書いておくことでインフラエンジニア側で後から多少修正するといったことも簡単にできるようになります。Webアプリのシステム中にシェルスクリプトを混ぜ込む時には本記事の様にある程度プラットフォーム互換を意識して書いておかないと、開発者のMacでは動くけどstagingに持っていったときに動かないといった現象が発生してしまいます。「このバッチはLinux環境でしか動かさないよ!」というルールで開発・運用をしても良いのですが、その場合は開発者の手元でテストされなくなって問題がスルーされてしまう可能性が高まります。Dockerを使って・・・という解決策も確かにありますが、それはそれでDockerの使い方をサポートしたりしないといけなくて辛みもあります(弊社社内ではまだDockerを完全に標準開発環境として整備しきれていない)。他社のエンジニアと連携して動くこともあるので、後で説明が面倒なことになるよりはおとなしくマルチプラットフォーム動作するように書いてしまった方が結果として面倒がないかな、とも思いました。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。