ここに問題があります。最初の行:以来、
$ /usr/bin/env stack setup.sh
か:
#!/usr/bin/env stack
は、スクリプトはシェルコマンドと同等のものを使用して呼び出されるべきであることを示すものとして、オペレーティングシステム(例えば、Linuxカーネル)によって解釈されますあなたはこれを手動で実行する場合、同じエラーが発生します
$ stack setup.sh
:env
は相当、stack
のパスを検索するだけであります。最初#!
行の後
-- stack blah blah whatever blah blah
:stack
がこのように呼び出されたとき、それは形式の行を探して、指定されたファイルを読み込み、ためです。代わりに、シェルの、Haskellのプログラムとしてhello.sh
を解釈
$ stack --resolver lts-10.0 script hello.sh
:あなたは、シェルコマンドを実行したかのようにスクリプトを実行するためにスタックに指示します
-- stack --resolver lts-10.0 script
:通常、この行は次のようになりますスクリプトを実行しますが、lts-10.0リゾルバを使用して実行すると、すべて正常です。
$ bash hello.sh
後:基本的に実行するのと同じである
$ stack exec bash hello.sh
:
しかし、あなたはコマンドstack exec bash
を使用するようにstack
を言ったので、stack
は相当でスクリプトを呼び出しますstack
のパスを設定するなどです。
FINALLYの場合、シェルbash
はスクリプトを実行しています。シェルのコメントを示す#
文字で始まるため、Bashは最初の行を無視します。しかし、バッシュは、二行目を解釈しようとするときに、シェルプロンプトで次のコマンドを入力するかのように、それはです:
$ -- stack exec bash
バッシュは、引数stack exec bash
で実行する--
という名前のプログラムを探し、エラーメッセージが表示されます。しかし、スクリプトは実行され続けているため、echo
とmy-exec
行が期待どおりに実行されます。
うわー。
ここはあなたの役に立つ方法の1つです。あなたが使用することができます。
#!/bin/bash
exec stack exec bash <<EOF
echo Echo printing
./hello
EOF
をこのシェルスクリプトは、基本的に実行するstack exec bash
用のスクリプトファイルとしてEOF
にすべてを渡す、いわゆる「ここドキュメント」を使用してstack exec bash
を呼び出します。
' - stack exec bash'行を削除するか、有効なコマンドに修正してください。 – jordanm
@jordanm、この行がなければ動作しません。そして私の質問は、それを修正する方法についてです。 – vrom911
まあ、それも*行*で動作していません。 –