При попытке 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
проблема с разделением аргумента?
watch
выполняет команды с аргументами путем передачи их sh -c
, таким образом, то, что Вы заканчиваете тем, что выполнили:
sh -c 'bash -c du -h /etc/passwd && df -h'
Оболочка, которую Вы выполняете, удаляет первый слой кавычек, которые Вы применили. -h
, /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 +++