이 명령을 사용하여 2초마다 화면에 임의의 값을 인쇄하고 싶지만 아무것도 인쇄되지 않습니다.
watch bash -c '"echo $RANDOM"'
그러나 이 명령은 2초마다 임의의 값을 인쇄합니다.
watch bash -c '"echo \$RANDOM"'
분명히 달러 기호를 피해야 하지만 그 이유를 알고 싶습니다. 첫 번째 경우 watch 명령이 명령이 올바르게 실행되고 있음을 맨 위에 보고하기 때문입니다.
Every 2.0s: bash -c "echo $RANDOM"
두 번째 경우에는 예상대로 이 명령이 실행되고 있다고 보고합니다.
Every 2.0s: bash -c "echo \$RANDOM"
알겠습니다. bash 명령에 올바르게 도달하려면 달러 기호를 이스케이프해야 합니다. 그런데 아직도 왜? watch 명령은 명령을 실행하기 전에 아무것도 출력하지 않도록 $RANDOM에 대해 무엇을 합니까?
답변1
주석에 언급된 @steeldriver와 마찬가지로 watch
기본적으로 명령을 실행하여 sh -c
. 그러나 먼저 공백으로 얻은 모든 인수를 연결하는 것 같습니다.
그리고
watch bash -c '"echo $RANDOM"'
bash
args , -c
, "echo $RANDOM"
, 을 취하고 두 args 모두와 함께 실행 bash -c "echo $RANDOM"
됩니다 .sh
-c
bash -c "echo $RANDOM"
그런 다음 sh
큰따옴표 안의 변수를 적절하게 확장합니다. sh
특수 항목을 지원하지 않으면 전체 $RANDOM
변수가 설정되지 않을 수 있으며 빈 문자열이 표시됩니다. 그런 다음 생성된 명령은 bash -c "echo "
Bash를 시작하고 줄 바꿈만 인쇄하도록 지시합니다.
(만약 당신 sh
이 Bash이고 그것을 갖고 있다면 $RANDOM
, 그냥 사용해도 됩니다 watch 'echo $RANDOM'
.)
쉘( sh
)이 볼 수 있는 곳에 백슬래시를 추가하면 ... "echo \$RANDOM"
확장되지 않고 백슬래시만 제거하면 됩니다. 내부 쉘( bash
)은 echo $RANDOM
변수 자체를 보고 확장합니다. 작은따옴표를 사용하여 쉘을 get 으로 정렬하는 경우에도 마찬가지입니다 ... 'echo $RANDOM'
.
다음과 같은 중간 쉘의 확장을 볼 수 있습니다( print 여야 함 out
).
export foo=out; watch 'bash -c "foo=in; echo $foo"'
중간 쉘을 건너뛰는 를 사용 watch -x
하면 따옴표 없이 예상대로 작동합니다.
watch -x bash -c 'echo $RANDOM'
답변2
~에서매뉴얼 페이지:
명령에는 "sh -c"가 주어졌습니다...
대신 echo $RANDOM
using을 사용하면 에서는 사용할 수 있지만 에서는 사용할 수 없기 때문에 출력을 얻을 수 없습니다 .sh
bash
$RANDOM
bash
sh