쉘이 파일 이름을 인식하지 못하는 watch 명령

쉘이 파일 이름을 인식하지 못하는 watch 명령

시도하는 동안 watch bash -c 'du -h /etc/passwd && df -h'파일 경로가 완전히 무시되고 대신 du -h현재 작업 디렉터리를 통해 실행된 것으로 보입니다. 을 실행했을 때에도 동일한 결과가 관찰되었으며 watch bash -c 'stat /etc/passwd && df -h'오류 stat와 함께 반환되었습니다 stat: missing operand. 대조적으로, 문제 없이 사용하거나 작동합니다 watch -e "command /path/to/file".watch "command /path/to/file"

그렇다면 왜 작동하지 않습니까 watch bash -c 'du -h /etc/passwd && df -h'? 인수 분할에 대한 문제 입니까 watch아니면 문제입니까?bash

답변1

watch인수가 포함된 명령을 에 전달하여 실행하므로 sh -c최종 실행 결과는 다음과 같습니다.

sh -c 'bash -c du -h /etc/passwd && df -h'

실행 중인 셸은 적용한 첫 번째 따옴표 레이어를 제거합니다. -h그런 다음 은 및 bash /etc/passwd로 전달되므로 효과적으로 무시됩니다. 다음과 같이 실행하십시오.$0$1

watch 'du -h /etc/passwd && df -h'
watch "bash -c 'du -h /etc/passwd && df -h'"

확인하려면 다음을 사용하세요 strace.

strace -fe execve -o log watch bash -c 'du -h /etc/passwd && df -h'

그리고 log다음을 포함합니다:

17132 execve("/usr/bin/watch", ["watch", "bash", "-c", "du -h /etc/passwd && df -h"], [/* 40 vars */]) = 0
17134 execve("/bin/sh", ["sh", "-c", "bash -c du -h /etc/passwd && df "...], [/* 42 vars */]) = 0
17135 execve("/bin/bash", ["bash", "-c", "du", "-h", "/etc/passwd"], [/* 42 vars */]) = 0
17135 execve("/usr/bin/du", ["du"], [/* 42 vars */]) = 0
17135 +++ exited with 0 +++

관련 정보