저는 bash 에뮬레이트 터미널을 사용하여 Windows 7에서 bash 스크립트를 개발 중입니다. 정확하게 말하면 MobaXterm 9.1에서 bash 터미널을 사용하고 있습니다. 그 이유는 Windows 7 랩톱이 있지만 내 스크립트는 궁극적으로 Jenkins Linux 서버에서 실행되기 때문입니다.
경로에 공백 및/또는 (가 있으면 스크립트가 성공적으로 실행되지 않습니다.
내 스크립트는 다음과 같습니다
#!/bin/bash
eclexe0="C:\Program Files (x86)\HPCCSystems\6.0.4\clienttools\bin\ecl.exe"
eclexe1="/drives/c/Program Files (x86)/HPCCSystems/6.0.4/clienttools/bin/ecl.exe"
clear
#1
echo "Testing if ecl.exe is available..."
if [ -f "$eclexe0" ]; then
echo "FOUND." >&2
else
echo "NOT FOUND." >&2
exit 1
fi
echo "Executing ecl.exe"
echo 1
eval "$eclexe0"
echo 2
내가 실행하면 출력은 다음과 같습니다.
보시다시피 스크립트는 경로에 만족하지 않습니다.C:\프로그램 파일(x86). 파일을 다른 경로(C:\oscar\eclfolder)로 이동하면 작동합니다. 나는 대답을 시도했다여기하지만 작동하지 않습니다. 아마도 Windows 7을 사용하고 있기 때문일 것입니다.
이 스크립트를 어떻게 작동하게 만들 수 있나요?
답변1
eval
실행 파일의 경로 이름에서 실행 중이므로 스크립트가 작동하지 않습니다 .
모든 쉘 스크립트에서 변수를 사용하여 실행할 명령을 지정할 수 있습니다.
인용문을 인용하지 않으면 $variable
변수의 내용도 공백을 기준으로 별도의 단어로 분할됩니다.
변수 참조를 인용했습니다. 그러나 을 실행하면 eval
변수 확장 결과를 구문 분석합니다.두번째시간. 필요하지 않습니다.
다음 이미지는 유익할 수 있습니다.
$ ls
file.txt file2.txt
$ somevar=ls
$ $somevar
file.txt file2.txt
$ ls -l
total 0
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file.txt
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file2.txt
$ somevar='ls -l'
$ $somevar
total 0
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file.txt
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file2.txt
$ "$somevar"
bash: ls -l: command not found
$
보시다시피 "ls -l"
, 인용문을 실행하려고 하면 쉘이 다음과 같은 명령을 찾습니다.정밀한이름 - 공백을 포함합니다.
내 경우에는 이것이 내가 원하는 것이 아니다.
그러나 귀하의 예에서는예당신은 무엇을 원합니까?
을 사용할 필요가 없으며 eval "$eclexe0"
을 사용하면 됩니다 "$eclexe0"
.
더 큰 그림
무료 조언: Linux 시스템에서 스크립트를 실행하려는 경우 Linux 시스템에서 테스트하십시오. MobaXterm은 Linux 박스가 아닙니다.
Vagrant와 VirtualBox(둘 다 무료)를 설치하고 테스트할 수 있는 가상 머신을 생성하세요.
추가 자료:
답변2
이 기사에 따르면 다음과 같이 따옴표("\"string"\")를 이스케이프해야 할 수도 있습니다.https://stackoverflow.com/questions/5253782/bash-problem-with-eval-variables-and-quotes