차이점은 다음을 통해 볼 수 있습니다 strace.
$ strace -ff -o bq watch sh -c 'ls\ /tmp/|wc -l'
^C
$ strace -ff -o nobq watch sh -c 'ls /tmp/|wc -l'
^C
$ grep exec bq* | grep sh
bq.29218:execve("/usr/bin/watch", ["watch", "sh", "-c", "ls\\ /tmp/|wc -l"], [/* 54 vars */]) = 0
bq.29219:execve("/bin/sh", ["sh", "-c", "sh -c ls\\ /tmp/|wc -l"], [/* 56 vars */]) = 0
bq.29220:execve("/bin/sh", ["sh", "-c", "ls /tmp/"], [/* 56 vars */]) = 0
$ grep exec nobq* | grep sh
nobq.29227:execve("/usr/bin/watch", ["watch", "sh", "-c", "ls /tmp/|wc -l"], [/* 54 vars */]) = 0
nobq.29228:execve("/bin/sh", ["sh", "-c", "sh -c ls /tmp/|wc -l"], [/* 56 vars */]) = 0
nobq.29229:execve("/bin/sh", ["sh", "-c", "ls", "/tmp/"], [/* 56 vars */]) = 0
역 따옴표의 경우 ls /tmp 받는 하나의 인자로 전달 -c에 sh예상대로 실행됩니다. 이 인용 부호가 없으면, 명령은 대신에 split을 제공 watch하며 ,이 명령은 sh제공된을 차례로 실행 sh하므로 ls인수 로만 전달되므로 -c하위 서브 sh는 베어 ls명령 만 실행 하고 현재 작업 내용을 나열합니다. 예배 규칙서.
그래서 왜 합병증 sh -c ...? 단순히 달리지 watch 'ls /tmp|wc -l'않겠습니까?
watch "sh -c 'ls /tmp | wc -l'"이 명령을 수행하면 원하는 효과를 얻을 수 있습니다. 이것은 잘못을 보지 않고 시도해sh -c ls /tmp보면 홈 디렉토리를 얻을 수 있습니다 (그러나 이유는 모르겠습니다 ...)