차이점은 다음을 통해 볼 수 있습니다 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
보면 홈 디렉토리를 얻을 수 있습니다 (그러나 이유는 모르겠습니다 ...)