2017-12-28 17 views
1

나는 실행 파일이 my-exec 인 매우 간단한 haskell 프로젝트를 가지고있다. 그것이하는 것은 "Hello, world!"입니다. 콘솔로.이상한 스택 bash 오류 : - : command not found

나는 내 실행 파일을 실행 스크립트 파일 bin/setup.sh을 만들려면 내가 그것을 실행하면 또한 내가

$ ./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 

을 그리고 나는 무엇을 이해하지 못하는 이 파일의 문제점과 왜 --: command not found이라고 표시되지만 여전히 예상대로 작동하는지 확인하십시오.

나는이 간단한 예제에서 훨씬 더 쉬운 형식으로 작성할 수 있다고 생각하지만 실제 상황에서는 사소한 임원 호출 중 10 번을 만들어야하고 stack exec 번을 여러 번 복사하고 싶지 않습니다.

그럼이 오류를 제거하려면 어떻게해야합니까?

+0

줄'- stack exec bash'를 제거하거나 유효한 명령으로 수정하십시오. – jordanm

+2

@jordanm,이 줄이 없으면 작동하지 않습니다. 그리고 내 질문은 정확하게 그것을 고치는 방법에 관한 것입니다. – vrom911

+0

글쎄, 라인과도 * 함께 작동하지 않습니다. –

답변

6

여기에 문제가 있습니다. 첫 번째 줄 : 이후,

$ /usr/bin/env stack setup.sh 

나 :

#!/usr/bin/env stack 

스크립트는 쉘 명령의 동등한를 사용하여 호출되는 것을 나타내는으로 운영 체제 (예를 들어, 리눅스 커널)에 의해 해석됩니다 당신이 수동으로 실행하는 경우

$ stack setup.sh 

, 당신은 같은 오류가 발생합니다 : envstack에 대한의 상응하는 경로를 검색하는 단지가있다. stack이 방법으로 호출 될 때,이 형태의 라인을 찾고, 지정된 파일을 읽고, 때문이다 : 첫 번째 #! 줄 뒤에

-- stack blah blah whatever blah blah 

합니다. 대신 쉘, 하스켈 프로그램으로 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 경로 설정 등.

마침내이면 쉘 bash에서 스크립트가 실행 중입니다.Bash는 쉘 주석을 나타내는 # 문자로 시작하기 때문에 첫 번째 행을 무시합니다.

$ -- stack exec bash 

배쉬 인수 stack exec bash 실행하는 --라는 이름의 프로그램을 찾습니다, 당신은 오류 메시지가 : 배쉬가 두 번째 줄을 해석 할 때, 당신은 쉘 프롬프트에서 다음 명령을 입력 한 것처럼입니다. 스크립트는 계속 실행되므로 echomy-exec 줄이 예상대로 실행됩니다.

와우.

다음은 사용자에게 도움이되는 방법 중 하나입니다. 당신은 사용할 수 있습니다 :이 쉘 스크립트가 소위 "여기에 문서"를 사용하여 stack exec bash를 호출합니다

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

echo Echo printing 
./hello 

EOF 

, 기본적으로 실행 stack exec bash위한 스크립트 파일로 EOF까지 모든 것을 전달합니다.

+0

"와우." - 참으로! 이것은 꽤 토끼가 구멍을 쫓아갔습니다. – chi

+0

'#!/usr/bin/env stack exec bash'를 사용할 수 있습니까? 편집 : 보이지 않습니다. '#!'줄에있는 명령 이름 뒤에 나오는 모든 것은 첫 번째 첫 번째 인수로 주어집니다. 파머. –

+0

감사! 이것은 정말 상세한 설명입니다! 안타깝게도,'stack exec'을'$ (...) '안에 호출했기 때문에 실제로 작동하지 않는 복잡한 실제 상황에 대해서는 작동하지 않습니다. 그래서 방금 bin/setup.sh'을 만들고'#!/usr/bin/env bash'라고하고'stack exec./bin/setup.sh'을 사용해서 스크립트를 호출합니다. – vrom911