내 bash 스크립트에는 다음 내용이 있습니다
CMD="{ head -n1 $DATE.$FROMSTRAT.new && egrep -i \"$SYMS\" $DATE.$FROMSTRAT.new; } > $DATE.$TOSTRAT.new"
echo "Running $CMD"
`$CMD`
내가 스크립트를 호출할 때
Running { head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new
script.sh: line 17: {: command not found
하지만 { head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new
명령줄에서 실행하면 제대로 작동합니다.
탈출을 시도했지만 {
실패했습니다. 어떻게 해야 하나요?
답변1
음, 명령줄에서 이러한 변수를 사용하면 단어로 분할되지만 이는 {
( 또는 ) 등과 같은 구문 항목을 구문 분석한 후에 발생합니다. if
따라서 이것을 원한다면 다음을 사용해야 합니다.eval
CMD="{ echo blah ; echo bleh; } > output"
eval "$CMD"
# output contains "blah" and "bleh"
eval
note는 변수 할당을 포함하여 현재 셸의 변수에 있는 모든 것을 실행 하지만 ( IFS
예를 들어 변경 사항은 스크립트의 나머지 부분에 흥미로운 영향을 미칠 수 있습니다). bash -c "$CMD"
최소한 변수 할당 문제를 완화하기 위해 별도의 셸에서 실행할 수 있습니다 .
또한 백틱은 명령의 출력을 캡처하여 명령줄에서 사용하는 데 사용되므로 $CMD
출력도 명령으로 실행됩니다.
$ CMD="echo foo"
$ `$CMD`
-bash: foo: command not found
출력을 파일로 리디렉션하는 것은 중요하지 않지만 대부분 필요하지 않을 수도 있습니다.
답변2
노력하다
function exec_cmd() {
printf "+ %s \n\n" "$1"
bash -c "$1" || exit 1
}
exec_cmd '{ head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new'
그러면 문자열 이스케이프에 대해 걱정할 필요가 없습니다. 사용법에
유의하세요 . 다음 매개변수 는 (스크립트 내 스크립트의 "이름") 로 사용되고 후속 매개변수는 위치 매개변수($1, $2 등)가 됩니다.bash -c <command>
<command>
$0