시도하는 동안 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 +++