QA@IT

bash スクリプトから nyaos のスクリプトへの変換

2849 PV

bashでこのようなシェルスクリプトを使っているので、

function rake() {
    if [ -e 'Gemfile' ]; then
        bundle exec rake "$@"
    else
        command rake "$@"
    fi
}

同様の機能をnyaosでも使いたく試してみたのですが書き方がわからず躓いています。

rake{
    if exist 'Gemfile' then
        bundle exec rake "%1"
    else
        command rake "%1"
    endif
}

わからない点は

  • Gemfileが存在してもbundle execが適用されない
  • commandの代替が見つからない
  • 引数に"%*"を使うと無駄な空白が入ってしまい失敗する

の3点です。

最後の問題点はとりあえず自分が使う範囲でrakeは一つしか引数を取らないので問題ないのですが、
あとの2つをどう解決すれば良いかわからない状態です。

アドバイスよろしくお願いします。

回答

  • Gemfileが存在してもbundle execが適用されない

これはシングルクォートを使っているからだと思いますので

   if exist "Gemfile" then

に変えればいけるんじゃないかと思います。

補足

Gemfileをシングルクォートで括ると失敗する理由が探しても見つけられませんでした。

単純にコマンドプロンプトだとシングルクォートはつかえません。
_nyaファイルを見つけるには dir '_nya' はだめですが dir "_nya" はOKです。
で、if exist ~ は もうDOSコマンドの領分だからダブルクォートじゃないのでみつけられないのかなと思ったまでです。

と、ただの勘だったわけですが、 試してみたら ls '_nya'でもうまくいかないですね。
古いドキュメントだとシングルクォート置換というのを見かけましたけど、3.3.8のnyaos_ja.txt にはシングルクォートに触れてませんし。
わかりませんが、ひょっとして機能なくなったのかもしれませんね。


  • commandの代替が見つからない

ここで定義してるrake関数ではなくてrakeを使いたいという事ですよね
試していないですが
cmd /cを使って

    else
        cmd /c rake "%1"
    endif

としてみた場合はどうでしょうか。
nyaosにも /c オプションあるみたいですけどnyaos上からはなんだかうまくいきませんでした。

※ 新しいコマンドプロンプト開いてしまうので、環境変数あたりが上手くやり取りできないかもしれません。


  • 引数に"%*"を使うと無駄な空白が入ってしまい失敗する

これはちょっとわかりません。
ただ、先の cmd /c rake "%1" はもしかするとcmd /c rake %* の方がいいかもしれません(ダブルクォートなし)。

編集 履歴 (2)
  • ありがとうございます。`cmd /c`を使う点、`%*` をクォートで囲まない点はわかったのですが、`Gemfile`をシングルクォートで括ると失敗する理由が探しても見つけられませんでした。どこかに参考にされたドキュメントがあれば教えていただけませんか? -
  • 回答のシングルクォートの部分に補足を追記しました。 -
  • なるほど、コマンドプロンプト側の仕様なんですね。説明有り難うございました。 -

NYAOS を開発している葉山と申します。

まず、NYAOS はシングルクォートをサポートしていません。シングルクォートを付けると、それをファイル名の一部と認識されてしまいます。

"%" に無駄な空白が入ってしまうというのは、おそらく"%" が "%1 %2 %3 %4 ..." と展開されてしまうからでしょう。これは、こういう仕様であるとしか言えません。

command については、command.com ではなく、cmd.exe を使って正解かと思います。ただ、rake の仕様がよく存じ上げないので、それで期待する動作をちゃんとできるかはわかりかねますが…

以上、よろしくお願いいたします。

編集 履歴 (1)
  • なるほど、詳しい解説有難うございます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。