2017-12-28 31 views
1

実行可能なmy-execの非常に単純なhaskellプロジェクトがあります。それは、「こんにちは、世界!」という印字だけです。コンソールに。奇妙なスタックbashエラー: - :コマンドが見つかりません。

私はそれを実行すると、私は

$ ./bin/setup.sh 
./bin/setup.sh: line 2: --: command not found 
Echo printing 
Hello, world! 

を取得し、私が何であるかを理解していない私の実行可能ファイルを実行しても、いくつかのecho

#!/usr/bin/env stack 
-- stack exec bash 

echo Echo printing 
my-exec 

を行いますスクリプトファイルbin/setup.shを作成したいですこのファイルの問題と、なぜそれが--: command not foundと表示されているのかはまだ分かりません。

私は、この簡単な例ではもっと簡単な形で書くことができますが、現実的な状況では、控えめなexec呼び出しを10回もしなければならず、stack execを何度も複製したくありません。

このエラーを取り除くにはどうすればよいですか?

+0

' - stack exec bash'行を削除するか、有効なコマンドに修正してください。 – jordanm

+2

@jordanm、この行がなければ動作しません。そして私の質問は、それを修正する方法についてです。 – vrom911

+0

まあ、それも*行*で動作していません。 –

答えて

6

ここに問題があります。最初の行:以来、

$ /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で実行する--という名前のプログラムを探し、エラーメッセージが表示されます。しかし、スクリプトは実行され続けているため、echomy-exec行が期待どおりに実行されます。

うわー。

ここはあなたの役に立つ方法の1つです。あなたが使用することができます。

#!/bin/bash 
exec stack exec bash <<EOF 

echo Echo printing 
./hello 

EOF 

をこのシェルスクリプトは、基本的に実行するstack exec bash用のスクリプトファイルとしてEOFにすべてを渡す、いわゆる「ここドキュメント」を使用してstack exec bashを呼び出します。

+0

「うわー」 - 確かに!これはかなりウサギが穴を追いかけるのだった。 – chi

+0

'#!/ usr/bin/env stack exec bash'だけできますか?編集:そう思わない。 '#!'行のコマンド名の後ろにあるものはすべて、最初の1つの引数として与えられます。バマー。 –

+0

ありがとう!これは本当に詳細な説明です! 残念ながら、複雑な実際のケースでは動作しません。 'stack exec'は' $(...) 'の中で呼び出します。だから私は 'bin/setup.sh'をshebang'#!/ usr/bin/env bash'にして、 'stack exec。/ bin/setup.sh'でスクリプトを呼び出しました。 – vrom911

関連する問題