2013-04-18 3 views
2

임 미안, 유닉스 스크립트와 아주 새로운 실수에 대해 내가이 "나오지도"명령을 실행하고 싶습니다 :)유닉스 : 변수에 나오지도 명령을 저장하면, 다음은

말할 수 있습니다 실행, 그것을 반향 .
먼저 실행될 명령을 반향시키고 싶습니다.
이렇게하려면 명령에 변수를 저장합니다.
그런 다음 명령을 실행하고 싶습니다.

나는 (내의 .sh 스크립트의 simplyfied 버전) 무슨 짓을 :

command="sed -i 's/FOO/BAR/g' myFile"; 
echo "Command: \"$command\"" ; 
$command ; 

내가 오류 가지고 :

Command: "sed -i 's/FOO/BAR/g' myFile" 
sed: -e expression #1, char 1: unknown command: `'' 

가 어떻게이 작은 따옴표를 이스케이프해야을? (아니면 큰 따옴표를 사용할 수 있나요?)

+0

'기대'가 대답 인 것 같습니다. – fedorqui

+1

'(set -x; sed-i의/FOO/BAR/g 'myFile)'을 사용하여'sed' 명령의 쉘 추적 출력을 얻는 것이 더 좋습니다. 코드를 이스케이프 처리하는 여러 가지 복잡한 문제가 발생하지 않도록 적절하게 재평가 할 수 있습니다. 이 문맥에서'eval'을 사용할 수 있습니다; 그것은 가볍게 놀 수있는 것이 아닙니다. –

답변

2

주어진 명령을 반향 한 다음 실행하는 편의 기능을 정의하십시오.

Command: sed -i s/FOO/BAR/g myFile 

를 다음 나오지도 (1) ​​명령을 수행

verbosely_do() { 
    printf 'Command: %s\n' "$*"; # printf, not echo, because [email protected] might contain switches to echo 
    "[email protected]"; 
} 

verbosely_do sed -i 's/FOO/BAR/g' myFile 

이 당신을 줄 것이다.

+0

나는 이런 식으로 좋아한다. 나는 스크립트를 작성하고 실행 된 명령을 "에코"하는 방법을 원했습니다. 이 방법으로, 나는 많은 도움이되는 논쟁을 피하지 않았다! $ @에 echo_ 스위치가있을 수 있으므로 echo가 아닌 _printf는 무엇을 의미합니까? $ *를 의미합니까? 또는 $ @? echo_에 스위치가 있음을 의미합니까? –

+0

@el_teedee,'echo' 명령은 실제로 [-'] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html#tag_20_37_04)를 인식하지 않도록 지정되었습니다. 그래서,'echo $ FOO'와 같은 것입니다.'FOO = "- n any"는 당신이 원하는 것을하지 않을 수도 있습니다. 왜냐하면'echo'가 옵션으로'-n'을 해석하지 못하기 때문입니다. – pilcrow

3

간단한 대답은 단지 작은 따옴표를 제거하는 것입니다 (나는 도움이되지 않았다이 오류에 구글에서 무엇을 발견)

: 나오지 인을 해석 나오지도의 일부로서 프로그램 :

command="sed -i s/FOO/BAR/g myFile" 
$command 

분명히 더 복잡 SED 스크립트를 위하여는 적절하지 않을 것입니다 (예를 들어, 공백 또는 세미콜론을 포함 할 것).

정답, 당신은 배열 (bash는, KSH, zsh을)가 쉘을 사용하는 가정입니다 :

command=(sed -i 's/FOO/BAR/g' myFile) 
echo "Command: \"${command[*]}\"" 
"${command[@]}" # the quotes are required here 

$command의 사용은 쉘 확장 따라서 하나의 우회 http://www.gnu.org/software/bash/manual/bashref.html#Arrays

+0

사실, 정규식에 공백이 포함될 수 있으므로 실제로는 단일/이중 따옴표를 사용해야합니다. 배열의 링크를 읽었습니다. 조금 복잡합니다 :) $ 명령의 쉘 확장이 작동하려면 따옴표가 필요합니다. (@pilcrow가 생각한 것과 같은 이유로이 예제에서''$ @ ''와 같은 인용 부호를 사용합니다.) –

+0

예, 따옴표를 사용하면 배열이 개별 요소로 확장되고, 따옴표는 배열이 공간으로 확장된다는 의미입니다. - delimited words. 이 시험을 해보십시오 :'a = ("1 2" "3 4"); 세트 - $ {a [@]}; echo $ #; 세트 - "$ {a [@]}"; echo $ #' –

2

를 참조하십시오 따옴표는 sed에 인수로 전달됩니다. 작은 따옴표를 풀거나 eval $command을 사용하십시오.

+0

regexp에 공백이 포함될 수 있으므로 따옴표를 제거 할 수 없습니다 ... 그리고 최근에는 'eval'을주의해서 사용해야한다고 썼습니다. –

+0

이스케이프, 공백 및 항상 쉘에서 드래그되지 않습니다.이 모든 것들을 이스케이프하고 싶다면'sed' 명령을 수행하는 쉘 스크립트를 생성 할 것입니다. 이는 모든 수준의 확장을 피하는 것보다 쉽고 디버그하기 쉽습니다. –

관련 문제