2010-05-03 2 views
1

ksh를 사용 중이고 문제가 있습니다. 이 코드가 실행되지 않는 이유는 무엇입니까?bash/ksh/scripting eval 서브 쉘 따옴표

[root]$ CMD="ls -ltr" 
[root]$ eval "W=$($CMD)" 
[root]$ ksh: ls -ltr: not found. 
[root]$ echo $W 

그러나 이것은 잘 작동합니다.

[root]$ CMD="ls -ltr" 
[root]$ eval 'W=$('$CMD')' 
[root]$ echo $W 

답변

2

$(...)을 외부 쉘에 의해 평가되지 않도록 백 슬래시로 이스케이프 처리해야합니다. $(...)eval으로 전달 될 때까지 그대로 보존해야합니다.

$ CMD="ls -ltr" 
$ eval "W=\$($CMD)" 
$ echo $W 
total 197092 srwxr-xr-x 1 root root... 
1

KSH이 값이 "LS -ltr"입니다 (공간을 유의 포함되어 당신이 원하는 하나의 위치 인수로 첫 번째 예에서 $CMD을 확대 "ls"(명령 이름)와 "-ltr"(옵션)의 두 인수로 확장되었습니다. 확장은 스크립트에 포함 된 다음 하위 셸로 전달되었으므로 이후 예제에서는이 확장을 사용합니다.

C 프로그램을 작성했다면 첫 번째 예는 argc = 1argv[0] = "ls -ltr"이고 두 번째 숫자는 argc = 2이고 argv[0] = "ls"argv[1] = "-ltr"입니다. 이 예제가 도움이되는 경우