명령에 -loop를 사용할 수 있습니까 for
?watch
내 시도로 이 오류를 해결하는 방법을 잘 모르겠습니다.
$ for i in 1 2 3; do echo $i; done
1
2
3
$ watch -n 10 for i in 1 2 3; do echo $i; done
-bash: syntax error near unexpected token `do'
$ watch for i in 1 2 3; do echo $i; done
-bash: syntax error near unexpected token `do'
$
답변1
watch
~의주문하다매개변수는 스크립트를 실행하는 데 사용됩니다 sh -c
.
만약에주문하다인수는 공백으로 구분된 토큰 목록(예: watch ls -l
)일 뿐이며 모든 토큰을 연결하여 실행합니다. 그러나 인용되지 않은 쉘 메타 문자는 다음과 같습니다.watch
실행하는 쉘에서 사용됨그리고는본 적이 없다watch
.
;
&
|
<
>
이는 실행 중인 셸이 watch
이러한 문자를 watch
명령의 끝을 표시하거나 백그라운드에서 watch 명령을 실행하거나 출력을 watch
다른 프로그램 으로 파이프하는 명령으로 해석하지 못하도록 이스케이프 또는 인용과 같은 메타 문자를 이스케이프하거나 인용해야 함을 의미합니다. (파이프라인을 실행하는 감시 스크립트 내 제외)
일반적인 인용 규칙을 적용하십시오. 변수 보간을 방지하려면 작은 따옴표를 사용하고, 그렇지 않으면 큰 따옴표를 사용하십시오. man watch
마지막 부분에 이를 보여주는 예제 섹션이 있습니다.
예를 들어:
watch -n 10 'for i in 1 2 3; do echo $i; done'
또는
watch -n 10 'grep something /var/log/kern.log | tail'
참고: .eg 없이 실행하려는 경우 watch
.-x
sh -c
watch -x awk -f script.awk
답변2
입력한 명령은 쉘이 실행을 시도하기 전에 현재 쉘에 의해 구문 분석됩니다 watch
. 쉘이 이를 설명합니다 ;
. do
왜냐하면 쉘로부터 이 항목을 보호하기 위해 아무 것도 하지 않았기 때문입니다. 예상치 못한 일이지만 처음부터 do
쉘이 이를 명령 종결자로 해석하는 것을 원하지 않습니다 .;
일반적으로 이스케이프(예: \;
) 또는 인용(예: )을 통해 ';'
셸에서 내용이 해석/확장되지 않도록 보호 할 수 있습니다. 귀하의 경우에는 ;
및 을 보호해야 합니다 $
. 하지만 질문이 있습니다. 무엇을 watch
해야 할까요?
일반적 watch
으로 명령을 실행하는 것 이상입니다. 즉, 일부 코드를 에 전달합니다 sh -c
. 코드는 하나 이상의 인수를 기반으로 작성됩니다 watch
( 예: watch echo foo
와 같이 작동함 watch "echo foo"
).
watch -x
쉘 없이 명령을 실행할 수 있지만 for
루프를 실행하려면 쉘이 필요합니다.
실제로 watch
여러 인수로 셸 코드를 작성하면 여러 공백이 중요하고 실수로 이를 인용할 때 오류가 발생할 수 있습니다. 비슷한 작업을 수행하는 또 다른 명령은 ssh
다음과 같습니다.내 대답.
이러한 모든 문제를 해결하는 한 가지 방법은 작은따옴표를 사용하는 것입니다.모든 것당신은 그것이 쉘 코드가 되기를 원합니다 watch
.정확히 하나코드의 매개변수를 포함합니다. 귀하의 경우:
watch -n 10 'for i in 1 2 3; do echo $i; done'
일반적으로 코드는 watch
실행될 때 sh
자체 따옴표가 필요하며 때로는 작은 따옴표가 필요합니다.거기, 따라서 전체 코드를 새 작은따옴표로 묶는 것만으로도 작동할 수도 있고 작동하지 않을 수도 있습니다. 새 작은따옴표가 현재 셸의 컨텍스트에서 이미 존재하는 작은따옴표와 서로 쌍을 이루는 경우에는 작동하지 않습니다(또는 가장 좋은 경우에는 우연히 작동합니다). 보다Bash에서 작은따옴표를 편리하게 사용하거나 전체 명령줄을 이스케이프하는 방법은 무엇입니까?. 연결된 질문에는 일반적인 수동 솔루션이 포함되어 있습니다. 내 답변은 Bash에서 이러한 참조를 자동화하는 방법을 제공합니다.